ObjectListView编辑不起作用

时间:2015-04-16 18:39:35

标签: c# winforms objectlistview

我试图使用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;

然后我创建了一个班级列表(ShieldingEntry)并将olvDepths.SetObjects()与列表一起使用。我的ShieldingEntry课程如下:

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

但是,当我点击该字段时,它不会进入编辑模式。我还尝试过DoubleClick,SingleClickAlways和F2Only模式,但他们也没有。

复选框工作正常。

**************我还有其他信息*********************

我已经拉动并构建了ObjectListView源代码,因此我可以逐步完成它。

我在OLV StartCellEdit方法中放置了一个断点,它被调用并且似乎设置并适当地选择控件。它永远不会出现......

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

我错过了什么?

2 个答案:

答案 0 :(得分:1)

之前我使用过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示例。根据需要可能不在确切的视图中,但似乎可以完成这项工作。

答案 1 :(得分:0)

对于任何其他有此问题的人。尝试在十进制中编辑“空”值时,我有它吗?在选项卡页面的OLV上。我的解决方案是将UseCustomSelectionColors设置为“ False”。我没有去其他地方看看它是否被报告为错误。好像是个错误。