1

ライブラリTreeListViewからMainForm があります。ObjectListView

ValueColumnさまざまなコンポーネントを使用して (2 列目) に値を入力したいと考えていWindows.Forms.Controlsます。

(名前は jsonTreeView) 法線は、TreeViewすべての値とその型を表示しました。それは私自身のクラスに基づいています:

public class DataTreeNode
{
    public string Name { get; set; }
    public DataTreeNodeType Type { get; set; }
    public string Value { get; set; }
    public List<DataTreeNode> Children { get; set; }
}

1 列目はName、2 列目はValue、3 列目は ですType。さまざまなタイプの値に対してさまざまな入力コントロールを作成したいと考えています (クラスに文字列として保存されますが、json に変換するとType値のように解析されます)。 メインフォーム

public partial class MainForm : 
{
    //...
    ObjectListView.EditorRegistry.Register(typeof(string), delegate (Object model, OLVColumn column, Object value)
    {
        var node = model as DataTreeNode;
        if(node == null) return new TextBox();
        if (column.Index == 1)
        {
        switch (node.Type)
            {
                //...
                case DataTreeNodeType.Boolean:
                    var cmbbBool = new ComboBox();
                    cmbbBool.Items.Add("False");
                    cmbbBool.Items.Add("True");
                    return cmbbBool;
                case DataTreeNodeType.Str:
                    return new TextBox();
                default:
                    return new TextBox();
            }
        }
        return new TextBox();
    }
    //...
}

ドキュメントには次のように記載されています。

セル エディタが作成されると、コントロールの Value プロパティを介してセルの値が与えられます (値があり、書き込み可能な場合)。書き込み可能な Value プロパティがない場合、Text プロパティはセル値のテキスト表現で設定されます。

ユーザーがセル内の値の編集を終了すると、新しい値がモデル オブジェクトに書き戻されます (可能な場合)。変更された値を取得するために、既定の処理では Value プロパティを再度使用しようとします。これが機能しない場合は、代わりに Text プロパティが使用されます。

しかし、comboBox (このコントロールHAS Textプロパティ) で任意の値を設定しようとすると、戻り値はnull. コンボボックスに文字列だけでなく、カスタム クラスと標準クラスを追加しようとしましたが、何も起こりません。 ここに画像の説明を入力

ここに画像の説明を入力 どうすればこのトリックを行うことができますか?

4

1 に答える 1

2

私はいくつかの解決策を見つけました(あまり良くありませんが、問題を解決します)。

ライブラリのソースコードでクラスをObjectListView見つけました。BooleanCellEditorから継承しComboBox、値を として提示しますBoolean。そのコードをソリューションにコピーし、値を からboolに変更しますstring

OLV ソースコード:

internal class BooleanCellEditor : ComboBox
{
    public BooleanCellEditor() {
        this.DropDownStyle = ComboBoxStyle.DropDownList;
        this.ValueMember = "Key";

        ArrayList values = new ArrayList();
        values.Add(new ComboBoxItem(false, "False"));
        values.Add(new ComboBoxItem(true, "True"));

        this.DataSource = values;
    }
}

私のソースコード:

public class StringBooleanCellEditor : ComboBox
{
    public StringBooleanCellEditor()
    {
        DropDownStyle = ComboBoxStyle.DropDownList;
        ValueMember = "Key";

        var values = new ArrayList
            {
                new ComboBoxItem("False", "Ложь"),
                new ComboBoxItem("True", "Истина")
            };

        DataSource = values;
    }
}

コードにより適した名前のクラスに名前を変更しました。

于 2016-12-26T05:53:05.193 に答える