2009-12-23 52 views
1

試圖在vb.net 2005vb.net列表框例外

Public Class Form1 
    Public Declare Function SendMessage Lib "user32" _ 
    Alias "SendMessageA" (ByVal hWnd As Long, _ 
    ByVal wMsg As Long, ByVal wParam As Long, _ 
    ByVal lParam As String) As Long 
    Public Const LB_FINDSTRING = &H18F 
    Dim listBoxHandle As IntPtr 

    Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp 
     listBoxHandle = ListBox1.Handle 
     ListBox1.SelectedIndex = SendMessage(listBoxHandle, LB_FINDSTRING, -1, Int(TextBox1.Text)) 

    End Sub 

End Class 
+0

你爲什麼要做p/invoke? – 2009-12-23 14:37:33

+1

小心分享異常? – Oded 2009-12-23 14:38:52

+0

**************例外文本************** System.OverflowException:算術運算導致溢出。 – JPro 2009-12-23 14:43:55

回答

2

您的P/Invoke聲明是錯誤的,它可以追溯到VB6時代。使用pinvoke.net來查找VB.NET等價物。但首先看一下MSDN Library,.NET已經大大改善了VB6提供的功能。你不必再訴諸於這些技巧了:

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged 
    ListBox1.SelectedIndex = ListBox1.FindString(TextBox1.Text) 
    End Sub 
+0

如何搜索下一個項目?和多個項目? – JPro 2009-12-23 16:07:08

+0

仍未查看MSDN Library主題? FindString()有一個重載,可以讓你告訴它從哪裏開始搜索。 – 2009-12-23 16:26:56

1

您發送此爲ANSI函數運行下面的代碼時,我得到一個例外。 .NET字符串是unicode。

您需要更新引用的P/Invoke。

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ 
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger,_ 
    ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr 

End Function 

而在你的代碼文件

Import System.Runtime.InteropServices 

這裏的頂部是SendMessage一些更多的信息 - http://www.pinvoke.net/default.aspx/user32.SendMessage

+0

說的DllImport沒有定義 – JPro 2009-12-23 14:47:12

0

假設你ListBox只String對象,你可以使用此爲KeyUp()功能

Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp 
    ListBox1.SelectedItem = TextBox1.Text 
End Sub 

但是,只有在列表框中找到整個文本時才能使用。如果你想獲得部分匹配,你必須編寫你自己的函數並處理重複。

而且,作爲一項規則,P/Invoke的應作爲最後的手段。如果您發現自己使用DllImportDECLARE語法,則應該停在那裏。有絕對的時間使用它,但99.999%的時間你可以離開沒有。

+0

非常感謝你。 – JPro 2009-12-23 15:36:51