尝试在vb.net 2005中运行以下代码时出现异常
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 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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
只有在ListBox中找到整个文本时才会有效。如果你想获得部分匹配,你必须编写自己的函数并处理重复项。
此外,作为一项规则,P / Invoke应作为最后的手段。如果您发现自己使用的是DllImport
或DECLARE
语法,那么就应该停在那里。肯定有使用它的时间,但99.999%的时间你可以没有使用它。