2009-08-12 3 views
9

여러분에게 쉬운 하나.다른 컨트롤에 키 스트로크 보내기

나는 목록 상자 위에 텍스트 상자가 있습니다.

텍스트 상자는 목록 상자에서 해당 데이터를 필터링하는 데 사용됩니다.

그래서 ... 사용자가 텍스트 상자에 입력하면 아래/위로/pagedown/pageup 키 입력을 "트랩"하여 목록 상자로 가져오고 싶습니다.

Win32 API를 사용하여 WM_KeyDown 메시지를 보낼 수 있다는 것을 알고 있습니다. 그러나 이렇게하려면 .NET 방식이 있어야합니다.

답변

11

SendKeys.Send() 메서드.

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

여기는 목록 항목을 선택할 수있는 코드입니다.

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

어떻게 SendKeys.Send이 목록 상자 컨트롤에 키 입력을 보낼 알 수 있습니까? – vIceBerg

+0

그리고 포커스를 텍스트 상자에 유지하려면 textbox.focus()를 바로 수행합니까? sendkey에 컨트롤을 전달하는 오버로드가 없다는 이상한 ... – vIceBerg

1

당신은 우리가 우리가 previewkeyup 이벤트를 사용하여 목록 상자를 필터링하는 텍스트 상자가 데이터가 우리의 WPF 응용 프로그램에서

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

다른 컨트롤에 키 스트로크를 보내기위한 데이터 바인딩 ?? – vIceBerg

+0

아니요, 목록 상자에서 데이터를 필터링합니다. 텍스트 상자의 Text 속성을 목록 상자의 DataSource 속성에 바인딩하고 DataSourceUpdateMode.OnPropertyChanged를 사용하면이 작업을 수행 할 수 있습니다. –

+0

팁 주셔서 감사합니다 – vIceBerg

0

바인딩 사용할 수 있습니다. 코드 내에서 어떤 키가 눌려 졌는지 확인할 수 있습니다 (내 앞에 코드가 없으면 e.Key == Key.UpArrow, C#의 클래스가 내장되어 있습니다). 단축키 중 하나 인 경우 적절하게 사용자 정의 컨트롤을 조작합니다.

우리는 이것을 사용자 컨트롤에 던져서 NavigateableListbox 또는 이와 비슷한 인터페이스를 구현하여 MoveUp(), MoveDown(), PageUp(), PageDown() 등을 구현하도록했습니다. 따라서 텍스트 상자 이벤트는 말한다 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; 
     } 
    }