2016-12-25 28 views
1

TreeListViewからObjectListViewライブラリのMainFormがあります。ObjectListView列の#comboboxの値を入力してください

異なるWindows.Forms.Controlsコンポーネントを使用してValueColumn(第2列)に値を入力したいとします。

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

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

最初の列は、第二は、Valueと第三Typeであり、Nameです。私は異なるタイプの値(文字列としてクラスに保存されますが、jsonに変換するとType値のように解析されます)に異なる入力コントロールを作成します。 MainForm

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(); 
    } 
    //... 
} 

ドキュメントは言う:

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

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

しかし、私は、コンボボックスで任意の値を設定しようとすると、(このコントロールTextプロパティを持つ)戻り値はnullです。 私はコンボボックスの文字列だけでなく、カスタムクラスとスタンダードクラスも追加しようとしましたが、何も起こりません。 enter image description here

enter image description here どうすればこのトリックを行うことができますか?

答えて

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; 
    } 
} 

が、私はそれがコードによりフィット名クラスの名前を変更しました。

関連する問題