2010-01-08 7 views
6

मैं Winforms DataGridViewTextBoxCell में एंटर कुंजी व्यवहार कैसे कर सकता हूं जैसे कि यह एक सामान्य Winforms TextBox (वर्तमान सेल को बदलने के बजाय टेक्स्ट में एक नई पंक्ति जोड़ें) में करता है?डेटाग्रिड व्यू: मैं वर्तमान कुंजी को बदलने के बजाय एंटर कुंजी को एक नई लाइन कैसे जोड़ सकता हूं?

उत्तर

8

ठीक है, मुझे पता चला कि समस्या को कैसे हल किया जाए। सबसे पहले, एक वर्ग CustomDataGridViewTextBoxEditingControl कहा जाता है जो DataGridViewTextBoxEditingControl से निकला है बनाते हैं, और EditingControlWantsInputKey इस तरह ओवरराइड:

public override bool EditingControlWantsInputKey(
    Keys keyData, 
    bool dataGridViewWantsInputKey) 
{ 
    switch (keyData & Keys.KeyCode) 
    { 
     case Keys.Enter: 
      // Don't let the DataGridView handle the Enter key. 
      return true; 
     default: 
      break; 
    } 

    return base.EditingControlWantsInputKey(keyData, dataGridViewWantsInputKey); 
} 

यह कुंजी दर्ज सौंपने और वर्तमान कक्ष में बदलाव करने से DataGridView बंद हो जाता है। हालांकि, एंटर कुंजी को एक नई लाइन नहीं जोड़ती है। (ऐसा लगता है कि DataGridViewTextBoxEditingControl ने एंटर कुंजी की कार्यक्षमता को हटा दिया है)। इसलिए, हम अपने आप को OnKeyDown ओवरराइड और कार्यक्षमता को लागू है, इस तरह की जरूरत है:

protected override void OnKeyDown(KeyEventArgs e) 
{ 
    switch (e.KeyCode & Keys.KeyCode) 
    { 
     case Keys.Enter: 
      int oldSelectionStart = this.SelectionStart; 
      string currentText = this.Text; 

      this.Text = String.Format("{0}{1}{2}", 
       currentText.Substring(0, this.SelectionStart), 
       Environment.NewLine, 
       currentText.Substring(this.SelectionStart + this.SelectionLength)); 

      this.SelectionStart = oldSelectionStart + Environment.NewLine.Length; 
      break; 
     default: 
      break; 
    } 

    base.OnKeyDown(e); 
} 

फिर, एक वर्ग CustomDataGridViewTextBoxCell कहा जाता है जो DataGridViewTextBoxCell से निकला है बनाते हैं, और CustomDataGridViewTextBoxEditingControl के प्रकार के वापस जाने के लिए EditType संपत्ति को ओवरराइड।

public override Type EditType 
{ 
    get 
    { 
     return typeof(CustomDataGridViewTextBoxEditingControl); 
    } 
} 

आप यह कर लेंगे, तो आप CellTemplate संपत्ति मौजूदा स्तंभ पर एक CustomDataGridViewTextBoxCell करने के लिए सेट कर सकते हैं, या आप एक वर्ग एक CustomDataGridViewTextBoxCell को CellTemplate पूर्व निर्धारित साथ DataGridViewColumn से ली गई बना सकते हैं, और आप पूरी तरह से तैयार हो जाएगा!

+0

Hay, मुझे यह समाधान पसंद है। यह मेरे लिए काम किया है लेकिन एक चीज गायब है। मैं इस डेटाग्रिडव्यू टेक्स्टबॉक्स के समान पंक्तियों पर मौजूद सभी कक्षों की पंक्ति ऊंचाई कैसे बढ़ा सकता हूं। क्या यह संभव है?। स्पष्ट रूप से यह कुंजी प्रेस प्रेस पर भी होने की आवश्यकता होगी। –

+0

माफ़ी, मेरी समस्या यह थी कि मेरी ऑटोोज़ीज़ पंक्तियों की संपत्ति सभी कोशिकाओं पर सेट की जा रही थी। Me.EditingControlDataGridView.Rows (EditingControlRowIndex) .इट + = 10 ने एक आकर्षण काम किया –

5

आप DataGridViewCellStyle.WrapMode संपत्ति को सत्य पर सेट करके ऐसा कर सकते हैं। MSDN से:

तो WrapMode एक सेल कि पाठ होता है के लिए गलत है, सेल एक पंक्ति पर पाठ प्रदर्शित करता है, और बॉक्स पात्रों के रूप में किसी भी एम्बेडेड न्यू लाइन वर्ण प्रदर्शित करता है। यदि सेल के लिए WrapMode सत्य है जिसमें टेक्स्ट है, तो सेल लाइन ब्रेक के रूप में न्यूलाइन वर्ण प्रदर्शित करता है, लेकिन सेल की चौड़ाई से अधिक किसी भी पंक्ति को लपेटता है।

आप कॉलम के लिए डिफ़ॉल्ट सेल स्टाइल का उपयोग कर सेल पर स्टाइल प्रॉपर्टी तक पहुंचने या कॉलम में सभी सेल के लिए इसे विशिष्ट कक्षों के लिए सेट कर सकते हैं।

[अपडेट] , अपने DataGridView में चुनिंदा कुंजी दर्ज एक संदेश फ़िल्टर फार्म DataGridView युक्त करने के लिए जोड़ अक्षम करने के लिए नीचे के रूप में दिखाया गया है:

public class KeyMessageFilter : IMessageFilter 
{ 
    private Form m_target = null; 

    public KeyMessageFilter(Form targetForm) 
    { 
     m_target = targetForm; 
    } 

    private const int WM_KEYDOWN = 0x0100; 

    private const int WM_KEYUP = 0x0101; 


    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == WM_KEYDOWN) 
     { 
      //Note this ensures Enter is only filtered if in the 
      // DataGridViewTextBoxEditingControl and Shift is not also pressed. 
      if (m_target.ActiveControl != null && 
       m_target.ActiveControl is DataGridViewTextBoxEditingControl && 
       (Keys)m.WParam == Keys.Enter && 
       (Control.ModifierKeys & Keys.Shift) != Keys.Shift) 
      { 
       return true; 
      } 

     } 

     return false; 
    } 
} 
:

private KeyMessageFilter m_filter = null; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    m_filter = new KeyMessageFilter(this); 
    Application.AddMessageFilter(m_filter); 

} 

यहाँ संदेश फिल्टर वर्ग है

अब टेक्स्ट संपादित करते समय एंटर कुंजी अक्षम कर दी गई है और आपको अगले सेल पर जाने के लिए टैब कुंजी दबाएं। Shift + Enter अभी भी आपके द्वारा संपादित किए जा रहे पाठ में एक नई लाइन जोड़ता है।

उम्मीद है कि इससे मदद मिलती है।

+0

धन्यवाद! आपके उत्तर ने सेल में एकाधिक लाइनों को अनुमति देने के मुद्दे को ठीक किया है, लेकिन दुर्भाग्यवश एंटर कुंजी अभी भी चयनित सेल को बदलती है। –

+0

@Zach, ऊपर मेरे अपडेट और नमूना कोड देखें। – Ash

+0

बस इसे स्पष्ट करने के लिए, अगर WrapMode सही पर सेट किया गया है तो एंटर कुंजी अभी भी अगली पंक्ति में चलेगी लेकिन अब आप पाठ में एक नई पंक्ति को एम्बेड करने के लिए Shift + Enter का उपयोग कर सकते हैं। यदि आप उस व्यवहार से खुश हैं तो संदेश फ़िल्टर की आवश्यकता नहीं है। – JonP

संबंधित मुद्दे