事件以检测添加到组合框中的项

本文关键字:组合 检测 添加 事件 | 更新日期: 2023-09-27 18:13:08

我正在创建一个继承自ComboBox的自定义控件。我需要检测何时将Item添加到ComboBox以执行我自己的检查。不管用c#还是Vb。NET,但我不知道怎么做。

我尝试了所有我在互联网上找到的东西,包括这个线程,但是答案中的链接是离线的,我没有设法猜出我应该怎么做。

例如,Vb.net中的代码:

Public Sub SomeFunc() Handles Items.CollectionChanged
    '....
End Sub

表示Items属性没有定义WithEvents

控件没有使用BindingSource。我需要控件在添加Item时执行自定义操作。项目直接添加到.Items属性:

customComboBox.Items.Add("item");

可以做到吗?

事件以检测添加到组合框中的项

我认为最好的方法是监听本地ComboBox消息:

  • CB_ADDSTRING
  • CB_INSERTSTRING
  • CB_DELETESTRING
  • CB_RESETCONTENT

不要被STRING这个词所迷惑,当你添加、插入或删除一个条目时,它们都会被触发。因此,当列表被清除时。

Public Class UIComboBox
    Inherits ComboBox
    Private Sub NotifyAdded(index As Integer)
    End Sub
    Private Sub NotifyCleared()
    End Sub
    Private Sub NotifyInserted(index As Integer)
    End Sub
    Private Sub NotifyRemoved(index As Integer)
    End Sub
    Protected Overrides Sub WndProc(ByRef m As Message)
        Select Case m.Msg
            Case CB_ADDSTRING
                MyBase.WndProc(m)
                Dim index As Integer = (Me.Items.Count - 1)
                Me.NotifyAdded(index)
                Exit Select
            Case CB_DELETESTRING
                MyBase.WndProc(m)
                Dim index As Integer = m.WParam.ToInt32()
                Me.NotifyRemoved(index)
                Exit Select
            Case CB_INSERTSTRING
                MyBase.WndProc(m)
                Dim index As Integer = m.WParam.ToInt32()
                Me.NotifyAdded(If((index > -1), index, (Me.Items.Count - 1)))
                Exit Select
            Case CB_RESETCONTENT
                MyBase.WndProc(m)
                Me.NotifyCleared()
                Exit Select
            Case Else
                MyBase.WndProc(m)
                Exit Select
        End Select
    End Sub
    Private Const CB_ADDSTRING As Integer = &H143
    Private Const CB_DELETESTRING As Integer = &H144
    Private Const CB_INSERTSTRING As Integer = 330
    Private Const CB_RESETCONTENT As Integer = &H14B
End Class

如果您的ComboBoxBindingSource支持,那么您可以侦听AddingItem事件并相应地处理它

您可以控制何时将项添加到ComboBox。因此,在此发生时不会触发任何事件。

您是向ComboBox添加项目的人。这不是外部可执行文件,而是你的代码。所以,你可以确保所有的添加都是通过一个函数AddItem(item As Object){…},当项目被添加到其中时,你应该处理你需要做的逻辑。所以,不需要事件

我最近也在为同样的问题而挣扎,发现文档和其他web帖子缺乏。Windows窗体组合框的核心是两个控件合二为一。一个紧凑的列表框和一个文本框。我想检测用户何时在TextBox中输入了不包含在Items集合中的新条目,以便处理新条目并可能将其添加到要选择的条目列表中。

控件没有直接定义一个覆盖这种情况的事件,TextChanged事件也太细了。

我在Leave事件处理程序中发现了以下逻辑,用于检测不在列表上的潜在新项目。

void cb_Leave(object sender, EventArgs e) {
    if (cb.SelectedIndex < 0 && string.IsNullOrEmpty(cb.Text)) {
        // The Text represents the potential new item provided by the user
        // Insert validation, value generation, etc. here
        // If the proposed text becomes a new item, add it to the list
        ListItemType newItem = new ListItemType(cb.Text);
        cb.Items.Add(newItem);
        // And don't forget to select the new item so that the
        // SelectedIndex and SelectedItem are updated to reflect the addition
        cb.SelectedItem = newItem;
    }
}

如果你只是使用字符串值作为你的列表项,那么上面的newItem就是简单的b.c. . text .