2009-12-23 49 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