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'。我没有去别处看它是否被报告为错误。似乎是一个错误。
我正在尝试使用 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'。我没有去别处看它是否被报告为错误。似乎是一个错误。