gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:20:35 26 4
gpt4 key购买 nike

我需要跟踪 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com