我需要跟踪列表框上的选定项,以便根据当前选定的值更新/禁用其他控件。
这是重现问题的代码:
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
、removeButton
和logSelectionButton
。如果您再次按下
addButton
(从空列表开始),然后再次按下removeButton
,最后再次按下addButton
,则在最后一次按下SelectedValueChanged
时,SelectedIndexChanged
和addButton
都不会触发,即使您在最后一次按下logSelectionButton
之前和之后按下addButton
,您将看到SelectedIndex
和SelectedValue
的值分别从-1变为0和从null
变为“项目1”,而“项目1”看起来是在列表框中选定的。这将导致我需要根据所选项目更新的任何其他控件保持禁用状态,直到用户手动选择列表框中的项目为止,即使第一个项目已被选中。
我想不出任何解决办法。也许还订阅了bindingList的
ListChanged
事件以查看列表是否为空,但是我不知道列表框中的项在事件处理程序激发之前或之后是否会更新,这将导致其他问题。 最佳答案
似乎您在数据绑定时在ListControl
内部处理PositionChanged
事件时发现了一个错误(如果在vs中打开异常,则将第一个项添加到空列表时会看到一个异常)。
由于在数据绑定模式下ListControl
派生类(如ListBox
、ComboBox
等)会将其选择与Position
的BindingManagerBase
属性同步,因此可靠的解决方法(基本上是更通用的抽象解决方案)是处理底层数据源绑定管理器的CurrentChanged
事件:
listBox1.BindingContext[List].CurrentChanged += (s, e) =>
System.Diagnostics.Debug.WriteLine("CURRENT");