1

我有TreeListView来自ObjectListView图书馆的 MainForm。

我想用不同的组件在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值一样解析)。 主窗体

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 属性。

但是,当我尝试使用组合框(此控件具有属性)设置任何值时,返回 Text值为null. 我不仅尝试在组合框中添加字符串,还尝试在自定义和标准类中添加 - 没有任何反应。 在此处输入图像描述

在此处输入图像描述 我该怎么做这个把戏?

4

1 回答 1

2

我找到了一些解决方案(不太好,但解决了问题)。

ObjectListView库的源代码中,我找到了BooleanCellEditor类。它继承自ComboBox并将值呈现为Boolean. 我在我的解决方案中复制该代码并将值从 更改boolstring

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 回答