如何防止ListBox.SelectedIndexChanged事件?

Ras*_*dit 21 .net c# winforms

我在我的C#2.0 Windows窗体应用程序中使用了一个列表框.填充列表框的方法是

    private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList)
    {
        lb.DataSource = reportColumnList.ReportColumns;
        lb.DisplayMember = "ColumnName";
        lb.ValueMember = "ColumnName";
    }
Run Code Online (Sandbox Code Playgroud)

但是,当它执行该方法时,它也会调用列表框的SelectedIndexChanged事件处理程序,即使我没有在上面的方法中设置所选索引.如何阻止为上述代码调用SelectedIndexChanged事件处理程序?

我希望仅在用户在ListBox中进行选择时才调用该事件.或者是否有任何其他事件仅供用户使用鼠标点击选择列表框项目?

另外,即使用户单击列表框中的空白区域,也会触发SelectedIndexChanged事件.所以我想知道它与MouseClick事件的不同之处是什么?

BFr*_*ree 19

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

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

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

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


Kim*_*jor 16

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

 lb.Items.Clear();
 lb.Items.AddRange(reportColumnList.ReportColumns.ToArray());
Run Code Online (Sandbox Code Playgroud)


小智 7

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

lstBxState.SelectionMode = SelectionMode.None;
lstBxState.DataSource = lstStates;
lstBxState.ValueMember = "StateId";
lstBxState.DisplayMember = "StateName";
lstBxState.ClearSelected();
lstBxState.SelectionMode = SelectionMode.One;
Run Code Online (Sandbox Code Playgroud)

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

  • 这个问题是关于 Windows 窗体的,该命名空间用于 ASP.NET 控件。 (2认同)