vb.net列表框异常

时间:2009-12-23 14:35:02

标签: vb.net

尝试在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

3 个答案:

答案 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应作为最后的手段。如果您发现自己使用的是DllImportDECLARE语法,那么就应该停在那里。肯定有使用它的时间,但99.999%的时间你可以没有使用它。