2009-08-12 10 views
9

Dễ dàng cho các bạn.Gửi phím tắt để điều khiển khác

Tôi có một hộp văn bản ở trên cùng của hộp danh sách.

Hộp văn bản được sử dụng để lọc dữ liệu ther trong hộp danh sách.

Vì vậy, khi người dùng nhập vào hộp văn bản, tôi muốn "bẫy" các phím tắt/lên/pagedown/pageup và chuyển chúng vào hộp danh sách.

Tôi biết tôi có thể sử dụng API Win32 và gửi tin nhắn WM_KeyDown. Nhưng phải có một số NET cách để làm điều này.

Trả lời

11

Phương thức SendKeys.Send().

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

Đây là mã mà bạn có thể chọn mục danh sách.

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

Làm thế nào để tôi cho SendKeys.Gửi để gửi tổ hợp phím đến kiểm soát hộp danh sách? – vIceBerg

+0

Và nếu tôi muốn tập trung ở lại trong hộp văn bản, tôi làm textbox.focus() ngay sau đó? Thật lạ khi phím gửi không có quá tải để vượt qua sự kiểm soát đối với nó ... – vIceBerg

1

Bạn có thể sử dụng dữ liệu Ràng buộc

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

Ràng buộc dữ liệu để gửi một tổ hợp phím đến một điều khiển khác ?? – vIceBerg

+0

Không, để lọc dữ liệu trong hộp danh sách. Nếu bạn ràng buộc thuộc tính Văn bản của hộp văn bản đến thuộc tính DataSource của hộp danh sách và sử dụng DataSourceUpdateMode.OnPropertyChanged bạn có thể đạt được điều này. –

+0

Cảm ơn lời khuyên – vIceBerg

0

Trong ứng dụng WPF, chúng ta có một hộp lọc một ListBox, chúng tôi sử dụng các sự kiện previewkeyup. Bên trong mã, chúng ta có thể kiểm tra những gì đã được nhấn (không có mã của tôi ở phía trước của tôi, nó giống như e.Key == Key.UpArrow, hoặc là có một lớp được xây dựng trong C# cho điều này). Nếu đó là một trong những phím nóng, chúng tôi thao tác điều khiển người dùng cho phù hợp.

Đối với hộp danh sách, chúng tôi đưa nó vào điều khiển người dùng và triển khai giao diện, gọi là NavigateableListbox hoặc một cái gì đó tương tự, buộc nó triển khai MoveUp(), MoveDown(), PageUp(), PageDown() vv sự kiện chỉ nói nếu 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; 
     } 
    }