2010-05-07 7 views
0

S'il vous plaît permettez-moi d'expliquer ce que j'ai et ce que j'essaie d'atteindre.Comment limiter un événement textchanged pour une zone de texte à une entrée au clavier uniquement?

J'ai une zone de texte (appelée txtb1) et un bouton en dessous (appelé btn_browse) sur un winform dans un projet vb.net.

Lorsque l'utilisateur clique sur le bouton, une boîte de dialogue de navigateur de dossier apparaît. L'utilisateur sélectionne son dossier désiré et lorsqu'il clique sur 'OK', la boîte de dialogue se ferme et le chemin du dossier sélectionné apparaît dans la zone de texte. Je veux également stocker cette valeur dans une variable à utiliser ailleurs (la valeur sera copiée dans un fichier xml lorsque l'utilisateur cliquera sur 'apply' sur le formulaire, mais cela n'a aucun effet et n'est pas lié à mon problème).

Pour que j'ai le code suivant:

Public myVar As String 
Private Sub btn_browse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_browse.Click 

    Dim f As New FolderBrowserDialog 
    If f.ShowDialog() = DialogResult.OK Then 
     txtb1.Text = f.SelectedPath 
    End If 
    myVar = txtb1.text 
    f.Dispose() 

End Sub 

Cette partie fonctionne sans problème.

Maintenant, que faire si l'utilisateur: 1- décide d'entrer le chemin manuellement plutôt que d'utiliser le bouton de navigation. ou, 2 après avoir utilisé le bouton de navigation et sélectionner le dossier, ils décident de changer manuellement l'emplacement

En essayant de résoudre ce que j'ajouté un événement TextChanged à la zone de texte comme suit:

Private Sub txtb1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtb1.TextChanged 
    myVar = txtb1.Text 

End Sub 

Cependant, cela ne fonctionne pas. Apparemment, et je ne sais pas si cela est pertinent, lorsque l'utilisateur sélectionne le dossier désiré en utilisant le bouton de navigation, l'événement textchanged est également déclenché. et quand je clique sur la zone de texte (pour la mettre au point) et que j'appuie sur n'importe quelle touche du clavier, l'application cesse de répondre.

Donc, mes questions sont: est-ce que je vais à ce sujet de la bonne façon? Si ma logique est imparfaite, quelqu'un pourrait-il m'indiquer à quel point une telle chose pourrait être atteinte? est-il possible de limiter les événements déclencheurs à la seule saisie du clavier pour contourner cela? J'ai essayé les événements keydown et keypress mais je reçois le gel. Pourquoi avez-vous besoin de stocker cette valeur dans une variable supplémentaire?

+0

vous remercie tous pour votre réponse.Comme ANC_Michael et Raja l'ont suggéré, j'ai défini la propriété textbox en lecture seule. Merci Raja pour la réponse claire et merci ANC_Michael pour les suggestions backcolor et forecolor. – mazrabul

Répondre

1

Affectez à la propriété TextBox.ReadOnly la valeur true, puis définissez la couleur de fond sur blanc et la couleur noire pour qu'elle ressemble à une zone de texte normale, mais elle ne peut pas être modifiée.

Ensuite, vous n'avez pas besoin de vous soucier de gérer les événements de la zone de texte comme vous le faites.

+0

J'ai fait ce que vous avez suggéré. Merci beaucoup pour votre réponse. Je vais prendre votre réponse comme acceptée. Merci beaucoup pour votre aide. – mazrabul

0

Pourquoi? Tant que la zone de texte est visible par l'utilisateur, elle contient la valeur définitive et peut être consultée directement. Donc, dans ce cas, vous devez cliquer sur le bouton "Appliquer" lire la valeur de la zone de texte au lieu de la variable, évitant ainsi ce problème avec les événements tout à fait.

1

Je pense que votre solution est assez simple. Traitez simplement la zone de texte comme un contrôle de téléchargement de fichier dans des formulaires Web. Faites-le en lecture seule. Ne laissez pas les utilisateurs modifier le texte. Cela résout deux problèmes:

  1. L'utilisateur sera toujours un sélectionnez un dossier en utilisant un mécanisme connu (en cliquant sur le bouton et le dossier de seleting)
  2. Pas besoin d'utiliser une variable puisque vous pouvez toujours obtenir l'emplacement de la zone de texte .

HTH

+0

merci pour une réponse très claire. J'ai fait comme vous l'avez suggéré. Malheureusement, ANC_Michael a suggéré la même chose une minute plus tôt, alors je vais considérer sa réponse comme la réponse acceptée. Pardon. – mazrabul

+0

Ce n'est pas un problème du tout. Tout ce qui nous intéresse dans cette communauté, c'est de s'entraider. Tant que votre problème est résolu, je suis heureux :-) – Raja

Questions connexes