Самый простой способ реализовать, не усложняя поток, - просто вызвать событие на listbox
, когда к нему добавлен элемент.Проблема в том, что у listbox
нет событий, позволяющих это сделать, но вы можете создать свою собственную версию с дюжиной строк кода.
Цель состоит в том, чтобы создать производный элемент управления listbox
затем вы добавляете к нему метод для запуска пользовательского события при добавлении элемента и бинго.
Вот пользовательский класс listbox
с пользовательским EventArgs
.
// custom override class over the list box so we can create an event when items are added
public class ListBoxWithEvents : ListBox
{
// the event you need to bind to know when items are added
public event EventHandler<ListBoxItemEventArgs> ItemAdded;
// method to call to add items instead of lst.Items.Add(x);
public void AddItem(object data)
{
// add the item normally to the internal list
var index = Items.Add(data);
// invoke the event to notify the binded handlers
InvokeItemAdded(index);
}
public void InvokeItemAdded(int index)
{
// invoke the event if binded anywhere
ItemAdded?.Invoke(this, new ListBoxItemEventArgs(index));
}
}
// basic event handler that will hold the index of the item added
public class ListBoxItemEventArgs : EventArgs
{
public int Index { get; set; } = -1;
public ListBoxItemEventArgs(int index)
{
Index = index;
}
}
Теперь вам нужно заменить listbox
на form
вместо ListBoxWithEvents
.У вас есть 2 способа сделать это, но я дам вам самый простой.Скомпилируйте свой код и перейдите в окно дизайна для form
.В вашем наборе инструментов у вас должен быть элемент управления ListBoxWithEvents
, и вы можете просто перетащить свой элемент form
и заменить тот, который у вас есть.Поскольку он является производным от listbox
, все, что у него есть, это дополнительные функции.Он не потерял ничего, что было раньше.
Теперь вам нужно изменить 2 вещи.В вашем form
выберите новый ListBoxWithEvents
элемент управления и перейдите в свойства событий, и вы найдете новое событие с именем ItemAdded
, вы можете дважды щелкнуть по нему, и оно должно создать событие, подобное следующему.Я также добавил образец MessageBox
, отображающий все, что вам нужно.
private void ListBox1_ItemAdded(object sender, ListBoxItemEventArgs e)
{
MessageBox.Show("Item was added at index " + e.Index + " and the value is " + listBox1.Items[e.Index].ToString());
}
Наконец, чтобы вызвать это событие, вам нужно использовать новый метод lst.AddItem(object);
вместо lst.Items.Add(object);
, так чток вашему примеру кода вы должны изменить это:
_form.lst_BarcodeScan.Invoke(new MethodInvoker(delegate
{
_form.lst_BarcodeScan.Items.Add(received + Environment.NewLine);
}));
на это:
_form.lst_BarcodeScan.Invoke(new MethodInvoker(delegate
{
_form.lst_BarcodeScan.AddItem(received + Environment.NewLine);
}));
Попробуйте, и теперь вы должны запускать это событие каждый раз, когда что-то добавляется в список.
Поскольку вы довольно новичок в программировании, я считаю важным упомянуть, что это событие будет запускаться в потоке пользовательского интерфейса, а не в потоке, который вы создали.Это означает, что он ведет себя нормально, как нажатие на button
вызывает событие button_click(object sender, EventArgs e)
.Никакой специальной темы не было.