如何防止ListBox.SelectedIndexChanged事件?

我在我的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事件有何不同?

您可以使用lb.Items.AddRange()填充列表框,而不是设置数据源。 除了不触发SelectedIndexChanged之外,这也不会预先选择第一个项目。

  lb.Items.Clear(); lb.Items.AddRange(reportColumnList.ReportColumns.ToArray()); 

你有三种方法可以解决这个问题。

A)在调用此方法之后,不要挂钩到SelectedIndexChanged事件。

B)在你的类中有一个私有布尔值,它最初设置为true。 在PopulateListBox方法的开头,将其设置为false,最后将其设置为true。 在SelectedIndexChanged的事件处理程序中,如果标志为false,则只返回并且不执行任何操作。

C)在PopulateListBox方法的开头,取消事件(this.listbox1.SelectedIndexChanged – = myMethod;),然后在方法完成之前,重新挂钩到该事件。

这个问题有一个最简单的答案:下面的代码片段可以建议解决这个问题。

 lstBxState.SelectionMode = SelectionMode.None; lstBxState.DataSource = lstStates; lstBxState.ValueMember = "StateId"; lstBxState.DisplayMember = "StateName"; lstBxState.ClearSelected(); lstBxState.SelectionMode = SelectionMode.One; 

这意味着,只需将选择模式设为“无”,并愉快地将数据绑定到控件。 然后继续将模式更改为所需模式(此处我已将其更改为One,您也可以选择Multiple)。

您应该知道,即使您不处理该事件,在分配DataSource属性时仍将自动选择列表中的第一项。 为了强制用户进行选择,您需要取消选择自动选择的项目。

如果SelectedIndexChanged事件处理程序在选择项目时触发某些function,您可能仍希望阻止执行此操作。 一种方法是跟踪代码当前是否填充列表框。 如果在填充列表框时触发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 } } 

SelectedIndexChanged方法内部,只是在一个if语句中,如果SelectedIndex == -1不执行任何其他操作,请执行此方法中的任何操作,可能不是最有效的代码但对我有效:)

我的情况可能是独一无二的,但我会在这里发布以防万一它可以帮助某人。

我正在使用Items.AddRange来填充我的ListBox而不是绑定。 我不知道为什么,但是在PostBack上,SelectedIndex从-1变为0.这可能是因为我的ListBox是SelectionMode="Single"

我的修复是在填充后手动将SelectedIndex设置为0而不是-1:

 listBox.Items.AddRange(items); listBox.SelectedIndex = 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 } 

基本上从事件中删除委托,然后在完成后添加。