我在C#2.0 windows窗体应用程序中使用了一个列表框。填充列表框的方法是
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList)
{
lb.DataSource = reportColumnList.ReportColumns;
lb.DisplayMember = "ColumnName";
lb.ValueMember = "ColumnName";
}
但是,当它执行方法时,它也会调用列表框的SelectedIndexChanged事件处理程序,即使我没有在上面的方法中设置选定的索引。如何防止为上述代码调用SelectedIndexChanged事件处理程序?
我希望仅在用户在ListBox中进行选择时才调用该事件。或者是否有任何其他事件仅供用户使用鼠标单击选择列表框项目?
另一方面,即使用户点击列表框中的空白区域,也会触发SelectedIndexChanged事件。所以我想知道它与MouseClick事件有何不同?
答案 0 :(得分:19)
有三种方法可以解决这个问题。
A)在调用此方法之后,不要挂钩到SelectedIndexChanged事件。
B)在你的班级中有一个私有布尔值,它最初设置为true。在PopulateListBox方法的开头,将其设置为false,最后将其设置为true。在SelectedIndexChanged的事件处理程序中,如果标志为false,则只返回并不执行任何操作。
C)在PopulateListBox方法的开头,取消事件(this.listbox1.SelectedIndexChanged - = myMethod;),然后在方法完成之前,重新挂钩到该事件。
答案 1 :(得分:16)
您可以使用lb.Items.AddRange()填充列表框,而不是设置数据源。除了不触发SelectedIndexChanged之外,这也不会预先选择第一个项目。
lb.Items.Clear();
lb.Items.AddRange(reportColumnList.ReportColumns.ToArray());
答案 2 :(得分:7)
这个问题有一个最简单的答案: 下面的代码段可以建议解决方法。
lstBxState.SelectionMode = SelectionMode.None;
lstBxState.DataSource = lstStates;
lstBxState.ValueMember = "StateId";
lstBxState.DisplayMember = "StateName";
lstBxState.ClearSelected();
lstBxState.SelectionMode = SelectionMode.One;
这意味着,只需将选择模式设为“无”,并愉快地将数据绑定到控件。然后继续将模式更改为所需模式(此处我已将其更改为One,您也可以选择Multiple)。
答案 3 :(得分:2)
您应该知道,即使您不处理事件,在分配DataSource属性时仍会自动选择列表中的第一项。为了强制用户进行选择,您需要取消选择自动选择的项目。
如果SelectedIndexChanged事件处理程序在选择项目时触发某些功能,您可能仍希望阻止执行此操作。一种方法是跟踪代码当前是否填充列表框。如果在填充列表框时触发SelectedIndexChanged事件,则可以避免执行这些操作:
private bool _populating = false;
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList)
{
_populating = true;
lb.DataSource = reportColumnList.ReportColumns;
lb.DisplayMember = "ColumnName";
lb.ValueMember = "ColumnName";
// clear the automatically made selection
lb.SelectedIndex = -1;
_populating = false;
}
private void ListBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (!_populating)
{
// perform the action associated with selecting an item
}
}
答案 4 :(得分:1)
在SelectedIndexChanged
方法中,只是在一个if语句中,如果SelectedIndex == -1
什么都不做,就做你想在这个方法做什么,可能不是最有效的代码但是工作的我:)
答案 5 :(得分:0)
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList)
{
lb.SelectedIndexChanged -= this.*MethodnamewhichhandlesthisEvent*; //unset eventhandler
lb.DataSource = reportColumnList.ReportColumns;
lb.DisplayMember = "ColumnName";
lb.ValueMember = "ColumnName";
lb.SelectedIndexChanged += this.*MethodnamewhichhandlesthisEvent*; //set the eventhandler
}
基本上从事件中删除委托,然后在完成后添加。
答案 6 :(得分:0)
我的情况可能是独一无二的,但我会在这里发布,以防它帮助某人。
我正在使用Items.AddRange
来填充我的ListBox而不是绑定。我不知道为什么,但是在PostBack上,SelectedIndex从-1变为0.这可能是因为我的ListBox是SelectionMode="Single"
。
我的修复是在填充后手动将SelectedIndex设置为0而不是-1:
listBox.Items.AddRange(items);
listBox.SelectedIndex = 0;