Привязка C#: как отключить CurrencyManager в BindingList, чтобы текущая позиция элемента не поддерживалась и не передавалась сигнал?

У меня есть два 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");
    }
}

Спасибо, - Бег.

два варианта: (1) не бороться с замыслом проекта валютного менеджера и делать это по-другому, или (2) хорошо ознакомиться с тем, как работает валютный менеджер, и найти способ обойти это. удачи.

Steven A. Lowe 06.11.2008 23:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
3 843
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Объявление listBox1 и listBox2 следующего типа, по-видимому, приводит к желаемому поведению.

class MyListBox: ListBox {

    protected override void OnSelectedIndexChanged (EventArgs a) {
        if (DataManager != null) {
            DataManager.SuspendBinding();
        }
    }

}

С уважением, тамберг

Хотя я обнаружил некоторую проблему ... Если вы добавите элемент в ListBinding, это приведет к нарушению этого решения и вернется к работе, как и без этого переопределения. Я добавил его в пример кода, чтобы вы могли его увидеть. Спасибо.

Ran 09.11.2008 18:39

Привет, возможно, вам нужно переопределить другой метод OnXChanged. Если это не поможет, другой подход может включать в себя упаковку CurrencyManager, но сейчас я не вижу способа изменить экземпляр CurrencyManager. С уважением

tamberg 09.11.2008 19:33

Я пробовал другие способы выяснить это, но ничего не работает. Поэтому мне придется прекратить использовать BindingList и просто поддерживать его с помощью обычного списка. Спасибо за помощь, простите за то, что удалил его как выбранный ответ, я не хочу непреднамеренно вводить в заблуждение других разработчиков.

Ran 10.11.2008 15:19

Мое решение этой проблемы - использовать обычный 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();

Другие вопросы по теме