我正在动态创建一个 Winforms 多选 ListBox 并将其添加到流程面板控件中。我从我创建的对象绑定数据源,并验证 DataSource 实际上有大约 14 个元素。当我这样做时,我会抛出listBox.SetSelected(0, true)
一个错误。System.ArgumentOutOfRangeException
我已经确定问题是,虽然 DataSource 有 14 个元素,但 Item 集合没有 (0),因此引发了异常。我的问题是为什么这两个彼此不同,为什么我不简单地将数据源中的 foreach 项目添加到项目集合中?
以下是我到目前为止的代码:
case InsertableItemParameter.ParameterType.ListBox:
//note: two-way bindings are not possible with multiple-select listboxes
Label lblListBox = new Label();
lblListBox.Text = param.DisplayText;
ListBox listBox = new ListBox();
listBox.DataSource = param.Values;
listBox.DisplayMember = "Value";
listBox.SelectionMode = SelectionMode.MultiExtended;
listBox.Size = new System.Drawing.Size(flowPanel.Size.Width - lblListBox.Size.Width - 10, 100);
listBox.SetSelected(0, true); //will throw argument out of range exception here!
listBox.SetSelected(1, true);
flowPanel.Controls.Add(lblListBox);
flowPanel.Controls.Add(listBox);
flowPanel.SetFlowBreak(listBox, true);
break;
下面是我尝试和工作的另一种解决方案,但为什么我还要使用 DataSource 与 Items 集合?
case InsertableItemParameter.ParameterType.ListBox:
//note: two-way bindings are not possible with multiple-select listboxes
Label lblListBox = new Label();
lblListBox.Text = param.DisplayText;
ListBox listBox = new ListBox();
//listBox.DataSource = param.Values;
listBox.DisplayMember = "Value";
listBox.SelectionMode = SelectionMode.MultiExtended;
listBox.Size = new System.Drawing.Size(flowPanel.Size.Width - lblListBox.Size.Width - 10, 100);
listBox.BeginUpdate();
foreach (String paramater in param.Values)
{
listBox.Items.Add(paramater);
}
listBox.EndUpdate();
listBox.SetSelected(0, true);
listBox.SetSelected(1, true);
flowPanel.Controls.Add(lblListBox);
flowPanel.Controls.Add(listBox);
flowPanel.SetFlowBreak(listBox, true);
break;
回答: 感谢所有的回复。这里的问题是可见性和 win-form 渲染。虽然 DataSource 和 Items 集合之间的差异并没有真正解决(除了少数人),但我的问题的真正根源是通过SetSelected()
在表单完成绘制后调用该方法来解决的。这在我的应用程序设计中引起了很多我必须解决的问题,但这就是问题所在。请参阅我标记为答案的回复。