2009-08-12 10 views
9

आपके लिए आसान है।अन्य नियंत्रण में कीस्ट्रोक भेजें

मेरे पास एक सूची बॉक्स के शीर्ष पर एक टेक्स्टबॉक्स है।

टेक्स्टबॉक्स सूची बॉक्स में थर्म डेटा फ़िल्टर करने के लिए उपयोग किया जाता है।

तो ... जब उपयोगकर्ता टेक्स्टबॉक्स में टाइप करता है, तो मैं डाउन/अप/पेजडाउन/पेजअप कीस्ट्रोक को "जाल" और सूची बॉक्स में फॉरवर्ड करना चाहता हूं।

मुझे पता है कि मैं 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

और यदि मैं टेक्स्टबॉक्स में फोकस रखना चाहता हूं, तो मैं टेक्स्टबॉक्स.फोकस() ठीक बाद में करता हूं? अजीब है कि प्रेषक को इसके नियंत्रण को पार करने के लिए अधिभार नहीं है ... – vIceBerg

1

आप उपयोग कर सकते हैं डेटा बाइंडिंग

  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

नहीं, सूची बॉक्स में थर्म डेटा फ़िल्टर करने के लिए। यदि आप टेक्स्टबॉक्स की टेक्स्ट प्रॉपर्टी को टेक्स्टबॉक्स की डेटा प्रॉपर्टी से जोड़ते हैं और DataSourceUpdateMode.OnProperty का उपयोग करते हैं तो आप इसे प्राप्त कर सकते हैं। –

+0

टिप – vIceBerg

0

हमारे WPF अनुप्रयोग में हम एक पाठ बॉक्स है कि एक लिस्टबॉक्स फिल्टर है, हम previewkeyup घटना का उपयोग करें। कोड के अंदर, हम जांच सकते हैं कि कौन सी कुंजी दबाई गई थी (मेरे सामने मेरा कोड नहीं है, यह e.Key == Key.UpArrow जैसा कुछ है, किसी भी तरह से इसके लिए सी # में निर्मित कक्षा है)। यदि यह गर्म कुंजी में से एक है, तो हम तदनुसार उपयोगकर्ता नियंत्रण में हेरफेर करते हैं।

सूची बॉक्स के लिए हमने इसे उपयोगकर्ता नियंत्रण में फेंक दिया और इसे एक इंटरफेस लागू किया, जिसे नेविगेटेबल लिस्टबॉक्स कहा जाता है या ऐसा कुछ, इसे मूवअप(), मूवडाउन(), पेजअप(), पेजडाउन() इत्यादि को लागू करने के लिए मजबूर किया गया ताकि टेक्स्टबॉक्स घटना सिर्फ कहते हैं अगर 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; 
     } 
    } 
संबंधित मुद्दे