2009-08-12 15 views
9

Łatwy dla ciebie.Wyślij polecenie do innej kontrolki

Mam pole tekstowe na górze listy.

Pole tekstowe służy do filtrowania danych w polu listy.

Tak ... Kiedy użytkownik wpisuje tekst w polu tekstowym, chciałbym "złapać" klawisze strzałek w dół/w górę/pagerown/pageup i przesunąć je do pola listy.

Wiem, że mogę użyć Win32 API i wysłać wiadomość WM_KeyDown. Ale musi być jakiś sposób .NET, aby to zrobić.

Odpowiedz

11

Metoda SendKeys.Send().

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

Oto kod, za pomocą którego można wybrać element listy.

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

Jak mogę powiedzieć SendKeys.Send wysłać klawiszy do sterowania listbox? – vIceBerg

+0

A jeśli chcę, aby fokus pozostawał w polu tekstowym, robię textbox.focus() zaraz po? Dziwne, że sendkey nie ma przeciążenia, aby przekazać do niego kontrolę ... – vIceBerg

1

Można użyć Wiązanie danych

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

Powiązanie danych w celu wysłania naciśnięcia klawisza do innej kontrolki? – vIceBerg

+0

Nie, aby filtrować dane w polu listy. Po powiązaniu właściwości Text pola tekstowego z właściwością DataSource w polu listy i skorzystaniu z DataSourceUpdateMode.OnPropertyChanged można to osiągnąć. –

+0

Dzięki za podpowiedź – vIceBerg

0

W naszej aplikacji WPF mamy pole tekstowe, które filtruje listbox, używamy zdarzenie previewkeyup. Wewnątrz kodu możemy sprawdzić, który klawisz został naciśnięty (nie ma mojego kodu przede mną, to coś takiego jak e.Key == Key.UpArrow, tak czy inaczej jest wbudowana klasa w C#). Jeśli jest to jeden z klawiszy skrótu, odpowiednio manipulujemy formantem użytkownika.

Dla listboxa wrzuciliśmy go do kontroli użytkownika i zaimplementowaliśmy interfejs, nazwany go NavigateableListbox lub coś podobnego, zmusił go do zaimplementowania funkcji MoveUp(), MoveDown(), PageUp(), PageDown() itd., Więc pole tekstowe impreza tylko mówi, że jeśli 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; 
     } 
    } 
Powiązane problemy