События для добавления / удаления элементов в списке c # .NET - PullRequest
3 голосов
/ 22 октября 2011

У меня есть элемент управления списком, в который item s динамически добавляются и удаляются вручную (из-за кнопки «Удалить элемент»).Когда количество элементов изменяется, я хотел бы обновить другие части пользовательского интерфейса, а именно подпись с надписью «Вы должны выбрать несколько файлов».и заголовок количества элементов.

Как можно добавить обработчик события или эффективный обработчик события при срабатывании при изменении количества элементов - например, ItemAdded или ItemRemoved или ItemsChanged

Примечание. Это не имеет ничего общего с тем, что пользователь выбирает элементы в списке.

Большое спасибо!

Ответы [ 3 ]

5 голосов
/ 22 октября 2011

Вы можете попробовать использовать BindingList<> в качестве DataSource, и тогда вы будете действовать в этом списке вместо ListBox - он автоматически получит обновления от BindingList.

BindingList имеет событие ListChanged.

Событие ListChanged имеет ListChangedEventArgs, который включает перечислитель ListChangedType:

BindingList<string> list = new BindingList<string>();
list.ListChanged += new ListChangedEventHandler(list_ListChanged);

void list_ListChanged(object sender, ListChangedEventArgs e) {
  switch (e.ListChangedType){
    case ListChangedType.ItemAdded:
      break;
    case ListChangedType.ItemChanged:
      break;
    case ListChangedType.ItemDeleted:
      break;
    case ListChangedType.ItemMoved:
      break;
    // some more minor ones, etc.
  }
}
3 голосов
/ 22 октября 2011

В коде кнопки «Удалить элемент» также обновите другие части пользовательского интерфейса.Это не должно нарушать принципы кодирования;Вы можете сделать что-то вроде этого:

void UpdatePartsOfTheUI() {
    // Do something here
    if(myListBox.Items.Count == 0) {
        myLabel.Text = "You must choose some files!";
    } else {
        myLabel.Text = String.Empty;
    }
}

/* ... */

void myButton_Click(object sender, EventArgs e) {
    if(myListBox.SelectedIndex > -1) {
        // Remove the item
        myListBox.Items.RemoveAt(myListBox.SelectedIndex);

        // Update the UI
        UpdatePartsOfTheUI();
    }
}

Это работает, если у вас мало кнопок, которые изменяют ListBox.Если вы это сделаете, просто оберните элементы ListBox Items.Add / Items.Insert / Items.Remove в методы, которые включают ваш другой код, и вместо этого вызовите их из ваших обработчиков кнопок.

0 голосов
/ 15 ноября 2017

Создайте метод, с которым вы можете делать то, что вы хотите с элементом ListBox. например:

моя программа получает потоки данных с сервера по запросу или запросу на поток. В моем winform1.cs мой элемент управления для добавления данных в список выглядит следующим образом.

public void AddData(string data)
    {
        if (this.ResponseData.InvokeRequired)
            BeginInvoke(new AddDataDelegate(AddData), new object[] { data });
        else
        {
            this.ResponseData.Items.Insert(0, data);
            DataDistro();

        }

    }

DataDistro Это то, что я назвал Мой метод для работы с новыми данными. Также обратите внимание, добавив значение индекса 0, новый элемент всегда будет сверху.

Если вы используете winForm, это намного проще. Кроме того, поскольку добавление элемента обрабатывается делегатом, основной поток по-прежнему открыт. Если вы не используете метод, который добавляет все данные в список, это не будет работать. И использование вышеупомянутого метода bindingsource будет следующей лучшей вещью.

вот пример моего метода DataDistro: строки моего ответа выглядят так: [Q], ATQuoteLastPrice, value [B], дата и время, открытый, высокий, низкий, близкий, объем

private void DataDistro()
{
    string data = ListBox.Items[0].ToString();
    string[] split = data.Split(new string[] {","}, stringsplitoptions.None);
    if(spit[0] == "[Q]")
    {
        //do some work
    }
    if(split[0] == "[B]")
    {
         //Do some work
    }
}

В вашем случае вы бы вызвали ваш метод в конце нажатия кнопки удаления элемента. Я бы также предложил сделать делегата или backgroundWorker, если работа обширная. Как вызов из нажатия кнопки Событие будет обработано потоком пользовательского интерфейса.

Каждый раз, когда вызывается метод AddData, метод DataDistro также вызывается после добавления данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...