ObjectListView 编辑不起作用

ObjectListView editing doesn't work

我正在尝试使用 ObjectListView(WinForm、C#)创建一个简单的列表框。目标是有一个单值(双精度值)和一个复选框。

我希望能够通过单击编辑双精度值,所以这里是我的 MyWindow.Designer.cs 文件中的相关代码行(为了提高效率,我省略了默认值):

this.olvDepths = new BrightIdeasSoftware.ObjectListView();
this.olvColumn1 = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));

...

this.olvDepths.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;
this.olvDepths.CheckBoxes = true;
this.olvDepths.CheckedAspectName = "IsDefault";
this.olvDepths.FullRowSelect = true;

// 
// olvColumn1
// 
this.olvColumn1.AspectName = "Depth";
this.olvColumn1.Text = "";
this.olvColumn1.IsEditable = true;

然后我创建了我的 class (ShieldingEntry) 的列表,并将 olvDepths.SetObjects() 与列表一起使用。我的 ShieldingEntry class 看起来像这样:

public class ShieldingEntry
{
    public double Depth { get; set; }
    public bool IsDefault { get; set; }
}

但是,当我单击该字段时,它不会进入编辑模式。我也试过 DoubleClick、SingleClickAlways 和 F2Only 模式,它们也不起作用。

复选框工作正常。

************** 我有更多信息 *********************

我已经提取并构建了 ObjectListView 源代码,因此我可以单步执行它。

我在 OLV StartCellEdit 方法中放置了一个断点,它被调用并似乎正确地设置和 select 控件。它只是从未出现过...

正如我在下面答案的评论中指出的那样,我在选项卡式对话框中获得了这个控件,如果我切换到另一个选项卡,然后返回,控件工作正常。

我错过了什么?

我以前使用过 ObjectListView,这是我必须做的:

处理 CellEditStarting 事件。当单元格进入编辑模式时会引发此事件。由于 OLV 并没有真正内置的编辑器,您必须自己制作。然后处理 CellEditFinishing 事件以验证数据,然后再将其放回模型中。

首先,处理 CellEditStarting 事件:

    private void objlv_CellEditStarting(object sender, CellEditEventArgs e)
    {
        //e.Column.AspectName gives the model column name of the editing column

        if (e.Column.AspectName == "DoubleValue")
        {
            NumericUpDown nud = new NumericUpDown();
            nud.MinValue = 0.0;
            nud.MaxValue = 1000.0;
            nud.Value = (double)e.Value;
            e.Control = nud;
        }
    }

这将创建您的编辑控件。如果要确保大小正确,可以使用事件对象中的 e.CellBounds 将控件(在本例中为 NumericUpDown)的大小设置为单元格边界。

这将在您单击单元格时显示编辑器。然后你可以处理编辑完成事件来验证数据:

    private void objlv_CellEditFinishing(object sender, CellEditEventArgs e)
    {
        if (e.Column.AspectName == "DoubleValue")
        {
            //Here you can verify data, if the data is wrong, call
            if ((double)e.NewValue > 10000.0)
                e.Cancel = true;
        }
    }

我认为不需要处理它,但验证用户数据是一种很好的做法。

CellEditStarting事件中的编辑控件可以是任何控件,甚至是用户定义的控件。我在单元格编辑器中使用了很多用户定义的控件(例如带有浏览按钮的文本框)。

[编辑]

我在此处 dropbox link 上传了一个似乎有效的示例。可能不在需要的确切视图中,但似乎可以完成工作。

对于遇到此问题的其他人。我在尝试以小数形式编辑 'null' 值时特别有它?在标签页上的 OLV 上。我的解决方案是将 UseCustomSelectionColors 设置为 'False'。我没有去别处看它是否被报告为错误。似乎是一个错误。