#c# #.net #winforms #events #listbox
#c# #.net #winforms #Мероприятия #список
Вопрос:
У меня есть элемент управления listbox, который item
динамически добавляется и удаляется вручную (из-за кнопки «удалить элемент»). Когда количество элементов изменяется, я хотел бы обновить другие части пользовательского интерфейса, а именно заголовок с надписью «Вы должны выбрать некоторые файлы». и заголовок количества элементов.
Как можно добавить обработчик событий или фактически обработчик событий для запуска при изменении количества элементов — например ItemAdded
, или ItemRemoved
или ItemsChanged
Примечание: Это не имеет никакого отношения к выбору пользователем элементов в списке.
Большое спасибо!
Ответ №1:
Вы можете попробовать использовать a 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.
}
}
Комментарии:
1.
((CurrencyManager)ListBoxName.BindingContext[list]).Refresh();
может использоваться в началеlist_ListChanged
для обновления lisybox.
Ответ №2:
В коде кнопки «Удалить элемент» также обновите другие части пользовательского интерфейса. Это не должно нарушать принципы кодирования; вы можете сделать что-то вроде этого:
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();
}
}
Это работает, если у вас не так много кнопок, которые меняют список. Если вы это сделаете, просто оберните элементы списка.Добавить /Элементы.Вставить /Элементы.Удалите методы in, которые включают ваш другой код, и вместо этого вызовите их из ваших обработчиков кнопок.
Ответ №3:
Создайте метод, с помощью которого вы можете делать все, что хотите, с элементом списка. например:
моя программа получает потоки данных с сервера по запросу или запросу потока. В моем 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,значение [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
}
}
В вашем случае вы бы вызвали свой метод в конце нажатия кнопки «Удалить элемент». Я бы также предложил создать делегата или фонового работника, если работа обширная. Поскольку вызов из события нажатия кнопки будет обрабатываться потоком пользовательского интерфейса.
Каждый раз, когда вызывается метод addData, метод DataDistro также вызывается после добавления данных.