Ups, te escribí el comentario de aquí abajo pensando que estaba en el foro de
VB.NET... qué confusión más tonta y qué pérdida de tiempo hacer ese código suponiendo que no te pueda servir de nada, pero bueno, de todas formas ahí dejo el código, por que en esencia la información proporcionada te servría igualmente para adaptarlo a VB6, me refiero a la solución basada en los mensajes de ventana, y lo cierto es que no has aclarado si trabajas en VB6 o VB.NET y en este subforo de VB nunca se sabe si andan preguntando de VB.NET o de VB6...
Saludos!
Se puede?
Si, se puede, simplemente debes controlar los mensajes de ventana para ese
ListBox.
En particular, para determinar si el texto o datos de un item han sido modificados, debes controlar el mensaje
LB_INSERTSTRING o
LB_SETITEMDATA respectivamente del tipo de item.
Para determinar cambios en la cantidad de items, debes controlar los mensajes
LB_ADDSTRING y
LB_DELETESTRING.
Los valores de los mensajes los puedes encontrar en el archivo "
WinUser.h" de la SDK de Windows:
/*
* Listbox messages
*/
#define LB_ADDSTRING 0x0180
#define LB_INSERTSTRING 0x0181
#define LB_DELETESTRING 0x0182
#define LB_SELITEMRANGEEX 0x0183
#define LB_RESETCONTENT 0x0184
#define LB_SETSEL 0x0185
#define LB_SETCURSEL 0x0186
#define LB_GETSEL 0x0187
#define LB_GETCURSEL 0x0188
#define LB_GETTEXT 0x0189
#define LB_GETTEXTLEN 0x018A
#define LB_GETCOUNT 0x018B
#define LB_SELECTSTRING 0x018C
#define LB_DIR 0x018D
#define LB_GETTOPINDEX 0x018E
#define LB_FINDSTRING 0x018F
#define LB_GETSELCOUNT 0x0190
#define LB_GETSELITEMS 0x0191
#define LB_SETTABSTOPS 0x0192
#define LB_GETHORIZONTALEXTENT 0x0193
#define LB_SETHORIZONTALEXTENT 0x0194
#define LB_SETCOLUMNWIDTH 0x0195
#define LB_ADDFILE 0x0196
#define LB_SETTOPINDEX 0x0197
#define LB_GETITEMRECT 0x0198
#define LB_GETITEMDATA 0x0199
#define LB_SETITEMDATA 0x019A
#define LB_SELITEMRANGE 0x019B
#define LB_SETANCHORINDEX 0x019C
#define LB_GETANCHORINDEX 0x019D
#define LB_SETCARETINDEX 0x019E
#define LB_GETCARETINDEX 0x019F
#define LB_SETITEMHEIGHT 0x01A0
#define LB_GETITEMHEIGHT 0x01A1
#define LB_FINDSTRINGEXACT 0x01A2
#define LB_SETLOCALE 0x01A5
#define LB_GETLOCALE 0x01A6
#define LB_SETCOUNT 0x01A7
#if(WINVER >= 0x0400)
#define LB_INITSTORAGE 0x01A8
#define LB_ITEMFROMPOINT 0x01A9
#endif /* WINVER >= 0x0400 */
#if defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0400)
#define LB_MULTIPLEADDSTRING 0x01B1
#endif
Y toda la información necesaria sobre los valores de la parametización (WParam/LParam) y el valor de retorno de los mensajes que he mencionado los tienes en la MSDN:
Ejemplo para determinar cambios en un item:
Public Enum ListBoxMessages As Integer
LB_SETITEMDATA = &H19A
LB_INSERTSTRING = &H181 ' Equivalente a "LB_SETTEXT"
End Enum
+
Public Class ListBoxEx : Inherits ListBox
<Description("Occurs when the text of a single item has changed")>
Public Event ItemTextChanged As EventHandler(Of ListBoxItemTextChangedEventArgs)
Protected Overridable Sub OnItemTextChanged(ByVal e As ListBoxItemTextChangedEventArgs)
If (Me.ItemTextChangedEvent IsNot Nothing) Then
RaiseEvent ItemTextChanged(Me, e)
End If
End Sub
Protected Overrides Sub WndProc(ByRef m As Message)
Select Case m.Msg
Case ListBoxMessages.LB_INSERTSTRING
Dim itemIndex As Integer = m.WParam.ToInt32()
If (itemIndex = -1) Then ' Equivalente al último item en la colección.
itemIndex = Me.Items.Count
End If
Dim newText As String = Marshal.PtrToStringUni(m.LParam)
Me.OnItemTextChanged(New ListBoxItemTextChangedEventArgs(itemIndex, newText))
Case ListBoxMessages.LB_SETITEMDATA
Throw New NotImplementedException("")
End Select
MyBase.WndProc(m)
End Sub
End Class
+
Public NotInheritable Class ListBoxItemTextChangedEventArgs : Inherits EventArgs
Public ReadOnly Property ItemIndex As Integer
Public ReadOnly Property NewText As String
Private Sub New()
End Sub
Public Sub New(ByVal itemIndex As Integer, ByVal newText As String)
Me.ItemIndex = itemIndex
Me.NewText = newText
End Sub
End Class
Saludos