2009-08-12 16 views
9

Sizler için kolay biri.Diğer kumandalara tuş vuruşu gönderin

bir liste kutusunda üstünde bir metin kutusu var.

metin kutusu liste olarak Ther veriyi filtre için kullanmaktır.

So ... metin kutusuna kullanıcı türü, ben istiyorum ne zaman için "tuzak" aşağı/yukarı/PageUp/PageDown tuş vuruşlarını ve liste onları yönlendirirken.

Ben Win32 API kullanmak ve WM_KEYDOWN mesaj gönderebilir biliyorum. Ancak bunu yapmak için bazı .NET yolu olmalı.

cevap

11

SendKeys.Send() Yöntem.

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

Burada bir liste öğesi seçebileceğiniz kod.

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

nasıl SendKeys.Send listbox kontrolüne tuş vuruşu göndermek için anlatır? – vIceBerg

+0

Ve eğer odağın metin kutusunda kalmasını istiyorsanız, hemen arkamda textbox.focus() yapıyorum? Şifreyi buna bir denetim geçirmek için bir aşırı yük olmadığını Garip ... başka kontrole bir tuş vuruşu göndermek için bağlayıcı – vIceBerg

1

Sen biz PreviewKeyUp olayını kullanmak, bir liste filtreleyen bir metin kutusu var Veriler bizim wpf uygulamasında

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

Veri ?? – vIceBerg

+0

Hayır, liste kutusundaki verileri filtrelemek için. Metin kutusunun Text özelliğini liste kutusunun DataSource özelliğine bağlarsanız ve DataSourceUpdateMode.OnPropertyChanged öğesini kullanarak bunu başarabilirsiniz. –

+0

Teşekkürler – vIceBerg

0

Bağlama kullanabilirsiniz. Kodun içinde, hangi tuşa basıldığını kontrol edebiliriz (benim önümdeki kodum yok, e.Key gibi bir şey == Key.UpArrow, her iki durumda da C# içinde bir sınıf var). Kısayol tuşlarından biri ise, kullanıcı kontrolünü buna göre manipüle ederiz.

Liste kutusu için onu bir kullanıcı denetimine attık ve NavigateableListbox adlı bir arabirim veya bunun gibi bir şey uygulayarak, MoveUp(), MoveDown(), PageUp(), PageDown() vb. olay sadece diyor e.Key = Key.UpArrow eğer {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; 
     } 
    } 
İlgili konular