c# - ListBox SelectedValueChanged/SelectedIndexChanged 在数据源更改时不触发

标签 c# winforms listbox .net-4.5

我需要跟踪 ListBox 上的选定项,以根据当前选定的值更新/禁用其他控件。

这是重现问题的代码:

public partial class Form1 : Form
{
    private readonly BindingList<string> List = new BindingList<string>();

    public Form1()
    {
        InitializeComponent();
        listBox1.DataSource = List;

        listBox1.SelectedValueChanged += (s, e) => System.Diagnostics.Debug.WriteLine("VALUE");
        listBox1.SelectedIndexChanged += (s, e) => System.Diagnostics.Debug.WriteLine("INDEX");

        addButton.Click += (s, e) => List.Add("Item " + (List.Count + 1));
        removeButton.Click += (s, e) => List.RemoveAt(List.Count - 1);

        logSelectionButton.Click += (s, e) =>
        {
            System.Diagnostics.Debug.WriteLine("Selected Index: " + listBox1.SelectedIndex);
            System.Diagnostics.Debug.WriteLine("Selected Value: " + listBox1.SelectedValue);
        };
    }
}

我的表单有一个列表框 listBox1和三个按钮:addButton , removeButtonlogSelectionButton .

如果您按 addButton (从一个空列表开始),然后是 removeButton最后 addButton再次,既不SelectedValueChanged也不SelectedIndexChanged将在最后addButton 开火按,即使你按 logSelectionButton最后一个之前和之后addButton按,您会看到 SelectedIndex 的值和 SelectedValue已从 -1 变为 0 并从 null 变为分别为“Item 1”,并且“Item 1”看起来在列表框中被选中。

这会导致我需要根据所选项目更新的任何其他控件保持禁用状态,直到用户手动选择列表框中的项目,即使第一个项目已经被选中。

我想不出任何解决方法。也许还订阅了我的 BindingList 的 ListChanged事件来查看列表是否为空,但我不知道列表框中的项目是否会在我的事件处理程序触发之前或之后更新,这会导致其他问题。

最佳答案

似乎您在 PositionChangedListControl 内部处理中发现了一个错误数据绑定(bind)时的事件(如果你在 VS 中打开异常,当第一个项目被添加到空列表时你会看到一个异常)。

由于 ListControl 的派生类,如 ListBoxComboBox 等在数据绑定(bind)模式下将它们的选择与 Position BindingManagerBase 的属性,可靠的解决方法(基本上是更通用的抽象解决方案)是处理 CurrentChanged底层数据源绑定(bind)管理器的事件:

listBox1.BindingContext[List].CurrentChanged += (s, e) =>
    System.Diagnostics.Debug.WriteLine("CURRENT");

关于c# - ListBox SelectedValueChanged/SelectedIndexChanged 在数据源更改时不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42357376/

相关文章:

c# - 如何在 #if DEBUG #endif 指令之间使用 nuget 包代码?

c# - 使用 safari、chrome 创建 cookie 失败,即使用 FF

c# - 来自不同类的 Feed listBox c#

c# - 解除绑定(bind)绑定(bind)源

WPF 列表框滚动条不起作用

c# - 将数据库数据插入列表框 C#

c# - 该字段永远不会分配给并且始终具有其默认值 null

c# - 开发多语言 Windows 应用程序 C#

c# - 在 GridView 中显示增量数据的最佳方式是什么?

c# - 如何在主窗体仍然响应时实例化窗体