2016-12-25 12 views
1

У меня есть MainForm с TreeListView из ObjectListView библиотека.C# combobox в столбце ObjectListView при вводе значения

Я хочу ввести значения в ValueColumn (вторая колонка) с различными компонентами Windows.Forms.Controls.

TreeView (имя jsonTreeView) нормальное отображение всех значений и их типов. Он основан на моем собственном классе:

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

Первый столбец Name, второй является Value и третий является Type. Я хочу создать различные элементы управления ввода для значений с разными типами (он сохраняется в моем классе как строка, но при преобразовании в 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(); 
    } 
    //... 
} 

Документация говорит:

После того, как редактор ячейки был создан, ему присваивается значение ячеек через свойство Value управления (если он есть, и она доступна для записи). Если у него нет свойства записи для записи, его свойство Text будет установлено с текстовым представлением значения ячеек.

Когда пользователь закончил редактирование значения в ячейке, новое значение будет записано обратно в объект модели (если возможно). Чтобы получить измененное значение, обработка по умолчанию пытается снова использовать свойство Value. Это не работает, вместо этого будет использовано свойство Text.

Но когда я пытаюсь установить любое значение с COMBOBOX (этот контроль HASText свойство) возвращаемое значение null. Я попытался добавить не только строки в combobox, но и обычные и стандартные классы - ничего не происходит. 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; 
    } 
} 

я переименовал класс, это назвать более нужным кодом.