ListBox.SelectedIndexChanged 第一次没有开火
ListBox.SelectedIndexChanged not firing on first occasion
我有一个绑定到默认为空的 BindingList 的 ListBox。
当所选索引更改时,它应该使用所选对象的数据更新其他控件。
问题是 SelectedIndexChanged 事件没有在第一个条目上触发(索引从 -1 变为 0)。
但是,当我再次单击第一个条目(尽管在这种情况下索引没有改变)以及添加更多条目时,它确实会触发。
我检查了 属性 myListBox.SelectedIndex 并且它实际上从 -1 变为 0 但由于某种原因没有调用事件处理程序。
有谁知道为什么会这样以及如何解决它?
这是我的代码:
public partial class main : Form
{
// The class of objects in my BindingList
[Serializable]
public class DisplayDefinition : INotifyPropertyChanged
{
private string _name;
private int _width, _height, _posx, _posy;
public string Name { get { return _name; } set { _name = value; NotifyPropertyChanged("Name"); } }
public int Width { get { return _width; } set { _width = value; NotifyPropertyChanged("Width"); } }
public int Height { get { return _height; } set { _height = value; NotifyPropertyChanged("Height"); } }
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string s)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(s));
}
}
// Defining the BindingList
BindingList<DisplayDefinition> displaydefinitions = new BindingList<DisplayDefinition>();
// Binding the list to my listbox
public main()
{
InitializeComponent();
listDisplays.DataSource = displaydefinitions;
listDisplays.DisplayMember = "Name";
}
// Button adding a new object to the list
private void btnNewDisplay_Click(object sender, EventArgs e)
{
DisplayDefinition d = new DisplayDefinition();
displaydefinitions.Add(d);
listDisplays.SelectedItem = d;
}
private void listDisplays_SelectedIndexChanged(object sender, EventArgs e)
{
DisplayDefinition d = (DisplayDefinition)listDisplays.SelectedItem;
// Do something with "d" ...
}
}
问题:
此行为仅在将 ListBox
与数据源一起使用时发生,而在手动填充 ListBox
时不会发生。
原因:
将第一项添加到数据源时,默认选择第一项 而不触发 SelectedIndexChanged
事件 (不知道为什么!) 这似乎是 ListBox
中的错误,这使得设置 SelectedItem
或 SelectedIndex
属性 无用。
解决方案(更像是一种解决方法):
您可以在设置实际 SelectedIndex
/SelectedItem
之前将 SelectedIndex
属性 更改为临时索引 (-1) 以触发 SelectedIndexChanged
事件.
像下面这样的东西应该可以工作:
// Button adding a new object to the list
private void btnNewDisplay_Click(object sender, EventArgs e)
{
DisplayDefinition d = new DisplayDefinition();
d.Name = "SomeName";
displaydefinitions.Add(d);
listDisplays.SelectedIndex = -1;
listDisplays.SelectedItem = d;
}
private void listDisplays_SelectedIndexChanged(object sender, EventArgs e)
{
if (listDisplays.SelectedIndex == -1) return;
DisplayDefinition d = (DisplayDefinition)listDisplays.SelectedItem;
// Do something with "d" ...
Console.WriteLine(d.Name);
}
希望对您有所帮助:)
我有一个绑定到默认为空的 BindingList 的 ListBox。
当所选索引更改时,它应该使用所选对象的数据更新其他控件。
问题是 SelectedIndexChanged 事件没有在第一个条目上触发(索引从 -1 变为 0)。
但是,当我再次单击第一个条目(尽管在这种情况下索引没有改变)以及添加更多条目时,它确实会触发。
我检查了 属性 myListBox.SelectedIndex 并且它实际上从 -1 变为 0 但由于某种原因没有调用事件处理程序。
有谁知道为什么会这样以及如何解决它?
这是我的代码:
public partial class main : Form
{
// The class of objects in my BindingList
[Serializable]
public class DisplayDefinition : INotifyPropertyChanged
{
private string _name;
private int _width, _height, _posx, _posy;
public string Name { get { return _name; } set { _name = value; NotifyPropertyChanged("Name"); } }
public int Width { get { return _width; } set { _width = value; NotifyPropertyChanged("Width"); } }
public int Height { get { return _height; } set { _height = value; NotifyPropertyChanged("Height"); } }
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string s)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(s));
}
}
// Defining the BindingList
BindingList<DisplayDefinition> displaydefinitions = new BindingList<DisplayDefinition>();
// Binding the list to my listbox
public main()
{
InitializeComponent();
listDisplays.DataSource = displaydefinitions;
listDisplays.DisplayMember = "Name";
}
// Button adding a new object to the list
private void btnNewDisplay_Click(object sender, EventArgs e)
{
DisplayDefinition d = new DisplayDefinition();
displaydefinitions.Add(d);
listDisplays.SelectedItem = d;
}
private void listDisplays_SelectedIndexChanged(object sender, EventArgs e)
{
DisplayDefinition d = (DisplayDefinition)listDisplays.SelectedItem;
// Do something with "d" ...
}
}
问题:
此行为仅在将 ListBox
与数据源一起使用时发生,而在手动填充 ListBox
时不会发生。
原因:
将第一项添加到数据源时,默认选择第一项 而不触发 SelectedIndexChanged
事件 (不知道为什么!) 这似乎是 ListBox
中的错误,这使得设置 SelectedItem
或 SelectedIndex
属性 无用。
解决方案(更像是一种解决方法):
您可以在设置实际 SelectedIndex
/SelectedItem
之前将 SelectedIndex
属性 更改为临时索引 (-1) 以触发 SelectedIndexChanged
事件.
像下面这样的东西应该可以工作:
// Button adding a new object to the list
private void btnNewDisplay_Click(object sender, EventArgs e)
{
DisplayDefinition d = new DisplayDefinition();
d.Name = "SomeName";
displaydefinitions.Add(d);
listDisplays.SelectedIndex = -1;
listDisplays.SelectedItem = d;
}
private void listDisplays_SelectedIndexChanged(object sender, EventArgs e)
{
if (listDisplays.SelectedIndex == -1) return;
DisplayDefinition d = (DisplayDefinition)listDisplays.SelectedItem;
// Do something with "d" ...
Console.WriteLine(d.Name);
}
希望对您有所帮助:)