2009-08-12 8 views
9

Facile pour vous les gars.Envoyer une frappe à un autre contrôle

J'ai une zone de texte au-dessus d'une zone de liste.

La zone de texte permet de filtrer les données dans la zone de liste. ... Lorsque l'utilisateur tape dans la zone de texte, je voudrais "piéger" les frappes bas/haut/pagedown/pageup et les transférer dans la liste. Je sais que je pourrais utiliser l'API Win32 et envoyer le message WM_KeyDown. Mais il doit y avoir un moyen. NET de le faire.

Répondre

11

SendKeys.Send() Méthode.

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      listBox1.Focus(); 
      SendKeys.Send(e.KeyChar.ToString()); 
     } 

Voici le code à travers lequel vous pouvez sélectionner un élément de liste.

private void Form1_Load(object sender, EventArgs e) 
     { 
      textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
      textBox1.AutoCompleteSource=AutoCompleteSource.CustomSource; 
      string[] ar = (string[])(listBox1.Items.Cast<string>()).ToArray<string>(); 
      textBox1.AutoCompleteCustomSource.AddRange(ar); 
     } 
     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 
      listBox1.Text = textBox1.Text; 
     } 
+3

Comment puis-je dire SendKeys.Send d'envoyer la combinaison de touches au contrôle listbox? – vIceBerg

+0

Et si je veux que le focus reste dans la zone de texte, je fais textbox.focus() juste après? Bizarre que sendkey ne soit pas surchargé pour lui passer un contrôle ... – vIceBerg

1

Vous pouvez utiliser la liaison de données

  listBox1.DataBindings.Add("DataSource", textBox1, "Text", true, DataSourceUpdateMode.OnPropertyChanged). 
      Format += (sender, e) => 
      { 
       e.Value = _strings.FindAll(s => s.StartsWith((string) e.Value)); 
      }; 
+0

Liaison de données pour envoyer une frappe à un autre contrôle ?? – vIceBerg

+0

Non, pour filtrer les données dans la zone de liste. Si vous liez la propriété Text de la zone de texte à la propriété DataSource de la zone de liste et que vous utilisez DataSourceUpdateMode.OnPropertyChanged, vous pouvez y parvenir. –

+0

Merci pour le conseil – vIceBerg

0

Dans notre application WPF, nous avons une zone de texte qui filtre une zone de liste, nous utilisons l'événement PreviewKeyUp. À l'intérieur du code, nous pouvons vérifier quelle touche a été pressée (ne pas avoir mon code devant moi, c'est quelque chose comme e.Key == Key.UpArrow, de toute façon il y a une classe intégrée en C# pour cela). Si c'est l'une des touches de raccourci, nous manipulons le contrôle de l'utilisateur en conséquence. Pour la listbox nous l'avons lancé dans un contrôle utilisateur et implémenté une interface, appelée NavigateableListbox ou quelque chose comme ça, l'avons forcé à implémenter MoveUp(), MoveDown(), PageUp(), PageDown() etc. événement dit que si e.Key = {Key.UpArrow mylistbox.MoveUp()}

1
private void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     if (e.KeyCode == Keys.PageUp || e.KeyCode == Keys.PageDown || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down) 
     { 
      // Setting e.IsInputKey to true will allow the KeyDown event to trigger. 
      // See "Remarks" at https://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown(v=vs.110).aspx 
      e.IsInputKey = true; 
     } 
    } 

    private void textBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     string send = ""; 
     if (e.KeyCode == Keys.PageUp) 
     { 
      send = "PGUP"; 
     } 
     else if (e.KeyCode == Keys.PageDown) 
     { 
      send = "PGDN"; 
     } 
     else if (e.KeyCode == Keys.Up) 
     { 
      send = "UP"; 
     } 
     else if (e.KeyCode == Keys.Down) 
     { 
      send = "DOWN"; 
     } 
     if (send != "") 
     { 
      // We must focus the control we want to send keys to and use braces for special keys. 
      // For a list of all special keys, see https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx. 
      listBox.Focus(); 
      SendKeys.SendWait("{" + send + "}"); 
      textBox.Focus(); 
      // We must mark the key down event as being handled if we don't want the sent navigation keys to apply to this control also. 
      e.Handled = true; 
     } 
    } 
Questions connexes