2009-12-23 6 views
1

Je me fais une exception lorsque vous essayez d'exécuter le code ci-dessous dans vb.net 2005vb.net listbox exception

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

Pourquoi faites-vous un p/invoke? –

+1

Vous souhaitez partager l'exception? – Oded

+0

************** Exception Text ************** System.OverflowException: L'opération arithmétique a entraîné un débordement. – JPro

Répondre

2

Votre déclaration P/Invoke est erronée, elle remonte à l'ère VB6. Utilisez pinvoke.net pour trouver les équivalents VB.NET. Mais d'abord jeter un oeil à la bibliothèque MSDN, .NET a considérablement amélioré au-delà de ce que VB6 fourni. Vous n'avez plus à recourir à ce genre de trucs:

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

comment rechercher l'article suivant? et plusieurs éléments? – JPro

+0

Vous n'avez toujours pas consulté le sujet MSDN Library? FindString() a une surcharge qui vous permet de dire où commencer la recherche. –

1

Vous envoyez ce à une fonction ANSI. Une chaîne .NET est unicode.

Vous devez mettre à jour le P/Invoke référencé.

<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 

Et en haut de votre fichier de code

Import System.Runtime.InteropServices 

Voici quelques informations supplémentaires sur SendMessage-http://www.pinvoke.net/default.aspx/user32.SendMessage

+0

dit DllImport n'est pas défini – JPro

0

En supposant que votre ListBox a seulement des objets chaîne que vous pouvez utiliser pour la fonction 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 

Cela ne fonctionnera que si le texte entier est trouvé dans le ListBox, cependant. Si vous voulez obtenir des correspondances partielles, vous devrez écrire votre propre fonction et gérer les doublons.

En règle générale, P/Invoke doit être utilisé en dernier recours. Si vous vous trouvez avec la syntaxe DllImport ou DECLARE, vous devriez arrêter là. Il y a certainement des moments pour l'utiliser, mais 99,999% du temps, vous pouvez vous en passer.

+0

merci beaucoup. – JPro