У меня есть два ListBox'а, которые привязаны к одному и тому же BindingList.
Проблема в том, что при изменении выбранного элемента в графическом интерфейсе он меняет позицию в BindingList, а затем BindingList сигнализирует другому ListBox об изменении выбранного элемента.
Итак, у меня также синхронизированы два элемента ListBoxes Selected Item, что для меня не очень хорошо.
Я хочу поддерживать синхронизацию списка элементов. без позиции курсора.
Как мне отключить этот курсор, чтобы он не поддерживался?
пример кода (просто добавьте два ListBox в форму во время разработки и зарегистрируйте события SelectedIndexChanged и зарегистрируйте событие нажатия кнопки с помощью кнопки):
public partial class Form1 : Form
{
BindingList<string> list = new BindingList<string>();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
list.Add("bla1");
list.Add("bla2");
list.Add("bla3");
this.listBox1.DataSource = list;
this.listBox2.DataSource = list;
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedIndex != -1)
System.Diagnostics.Trace.WriteLine("ListBox1: " + listBox1.SelectedItem.ToString());
}
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox2.SelectedIndex != -1)
System.Diagnostics.Trace.WriteLine("ListBox2: " + listBox2.SelectedItem.ToString());
}
// Register this event to a button
private void button1_Click(object sender, EventArgs e)
{
list.Add("Test");
}
}
Спасибо, - Бег.





Объявление listBox1 и listBox2 следующего типа, по-видимому, приводит к желаемому поведению.
class MyListBox: ListBox {
protected override void OnSelectedIndexChanged (EventArgs a) {
if (DataManager != null) {
DataManager.SuspendBinding();
}
}
}
С уважением, тамберг
Хотя я обнаружил некоторую проблему ... Если вы добавите элемент в ListBinding, это приведет к нарушению этого решения и вернется к работе, как и без этого переопределения. Я добавил его в пример кода, чтобы вы могли его увидеть. Спасибо.
Привет, возможно, вам нужно переопределить другой метод OnXChanged. Если это не поможет, другой подход может включать в себя упаковку CurrencyManager, но сейчас я не вижу способа изменить экземпляр CurrencyManager. С уважением
Я пробовал другие способы выяснить это, но ничего не работает. Поэтому мне придется прекратить использовать BindingList и просто поддерживать его с помощью обычного списка. Спасибо за помощь, простите за то, что удалил его как выбранный ответ, я не хочу непреднамеренно вводить в заблуждение других разработчиков.
Мое решение этой проблемы - использовать обычный List вместо BindingList и просто вызвать (перед изменением) объект Form: this.BindingContext [Ваш список] .SuspendBinding (); и после изменения в Список this.BindingContext [Ваш список] .ResumeBinding (); Это обновляет все ограниченные элементы управления.
Обратите внимание, что это также отмечено в Ссылка MSDN здесь:
"If you are bound to a data source that does not implement the IBindingList interface, such as an ArrayList, the bound control's data will not be updated when the data source is updated. For example, if you have a combo box bound to an ArrayList and data is added to the ArrayList, these new items will not appear in the combo box. However, you can force the combo box to be updated by calling the SuspendBinding and ResumeBinding methods on the instance of the BindingContext class to which the control is bound."
Добавьте эту строку в Form_Load:
this.listBox1.BindingContext = new BindingContext();
два варианта: (1) не бороться с замыслом проекта валютного менеджера и делать это по-другому, или (2) хорошо ознакомиться с тем, как работает валютный менеджер, и найти способ обойти это. удачи.