PDA

View Full Version : Quick Search on ListBox



A.Noor
پنج شنبه 03 اردیبهشت 1383, 10:33 صبح
با سلام
در Vb6 اگر یک TextBox و یک ListBox داشتیم می‌توانستیم با کمک تابع SendMessageA همراه با تایپ عبارت در TextBox ایندکس لیست روی آیتم مشابه قرار گیرد و به اینصورت یک جستجوی سریع روی لیست انجام دهیم :‌

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const LB_FINDSTRING = &H18F
Private Sub Text1_Change()
List1.ListIndex = SendMessage(List1.hWnd, LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
End Sub

معادل این دستورات در Vb.net چیست ؟
من از این کدها استفاده کردم :

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As System.IntPtr, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Integer

Const LB_FINDSTRING = &H18F

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
ListBox1.SelectedIndex = SendMessage(ListBox1.Handle, LB_FINDSTRING, -1, TextBox1.Text.ToString)
End Sub

ولی خطای زیر را می‌دهد :

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in system.windows.forms.dll

Additional information: Specified argument was out of the range of valid values.

Voldemort
پنج شنبه 03 اردیبهشت 1383, 15:12 عصر
علی عزیز قبل از End Class تعریف تابع API را به شکل زیر اضافه کن:


' Declare the SendMessage function.
Declare Auto Function SendMessage Lib "user32" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As String) As IntPtr

حالا در رویداد مورد نظرت این تابع رو بصورت زیر فراخوانی کن:


lstQS.SelectedIndex() = SendMessage(lstQS.Handle, &H18F, -1, txtQS.Text).ToInt64

lstQS نام ListBox و txtQS نام TextBox است.

A.Noor
شنبه 05 اردیبهشت 1383, 07:42 صبح
جواب داد Volemort عزیز . ممنونم.