2016-12-25 1 views
1

Ich habe MainForm mit TreeListView von ObjectListView Bibliothek.C# Combobox in ObjectListView Spalte, wenn Wert

Ich möchte Werte in ValueColumn (zweite Spalte) mit verschiedenen Windows.Forms.Controls Komponenten eingeben.

Die TreeView (Name ist JsonTreeView) normal angezeigt alle Werte und ihre Typen. Es basiert auf meiner eigenen Klasse:

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

Erste Spalte ist Name, zweite ist Value und dritte ist Type. Ich möchte verschiedene Eingabesteuerelemente für Werte mit verschiedenen Typen erstellen (es in meiner Klasse als Zeichenfolge gespeichert, aber bei der Konvertierung in JSON ist es parse wie Type Wert). 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(); 
    } 
    //... 
} 

Dokumentation sagt:

Sobald die Zellen-Editor erstellt wurde, wird der Wert der Zelle über die Kontrollen Value-Eigenschaft angegeben wird (wenn es einen hat, und es ist beschreibbar). Wenn es keine beschreibbare Value-Eigenschaft besitzt, wird die Text-Eigenschaft mit einer Textdarstellung des Zellenwerts festgelegt.

Wenn der Benutzer den Wert in der Zelle bearbeitet hat, wird der neue Wert (falls möglich) in das Modellobjekt zurückgeschrieben. Um den geänderten Wert zu erhalten, versucht die Standardverarbeitung, die Value-Eigenschaft erneut zu verwenden. Wenn das nicht funktioniert, wird stattdessen die Text-Eigenschaft verwendet.

Aber wenn ich versuche, jeden Wert mit comboBox einzustellen (diese Steuerung HATText Eigenschaft) Rückgabewert null ist. Ich habe versucht, nicht nur Zeichenfolgen in Combobox, sondern benutzerdefinierte und Standardklassen hinzuzufügen - nichts passiert. enter image description here

enter image description here Wie kann ich diesen Trick machen?

Antwort

2

Ich fand eine Lösung (nicht so gut, aber das Problem zu lösen).

Im Quellcode von ObjectListView Bibliothek fand ich BooleanCellEditor Klasse. Er erbt von ComboBox und präsentiert den Wert als . Ich kopiere diesen Code in meine Lösung und ändere den Wert von bool zu string.

OLV Quellcode:

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

Mein Quellcode:

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

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

     DataSource = values; 
    } 
} 

I umbenannt Klasse, die es mehr passen, um Code nennen.

Verwandte Themen