2009-12-11 13 views
9

में डिफ़ॉल्ट एंटर/रिटर्न कुंजी व्यवहार अक्षम करें vb.net डेटाग्रिडव्यू में डिफ़ॉल्ट प्रविष्टि/वापसी कुंजी व्यवहार अगली पंक्ति में जाने के लिए है, इससे बचने के लिए एक त्वरित और आसान तरीका है।डेटाग्रिडव्यू

कोई सुझाव का स्वागत करते

उत्तर

26

आप घटना

Private Sub DataGridView1_Keydown (...) Handlers DataGridView1.KeyDown 
    If e.KeyCode = Keys.Enter Then 
     ' Your code here 
     e.SuppressKeyPress = True 
    End If 
End Sub 

gridview कुंजी दबाए में कुछ इस तरह की कोशिश कर सकते हैं एक और विकल्प एक कस्टम ग्रिड दृश्य नियंत्रण

DataGridView.ProcessDataGridViewKey Method

+0

यह आकर्षण – Ramji

+0

+1 तरह काम करता है यह मैं क्या जरूरत है। धन्यवाद – gyurisc

+0

एप्लिकेशन e.suppressKeyPress = true के रूप में जल्द ही समाप्त हो जाता है। – Kenta

1
बनाने के लिए किया जाएगा

डेटाग्रिड व्यू को ओवरराइड करें (अपना खुद का लिखें जो उससे प्राप्त होता है), और ऑनके को संसाधित करें yDown विधि।

public partial class UserControl1 : DataGridView 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
      return; 

     base.OnKeyDown(e); 
    } 
} 
2

तुम बस कुंजी दबाने घटना का उपयोग कर सकते हैं:

private void dataGridView1_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.Enter) 
      { 
       //You're Code 
      } 
      e.Handled = true; 
      return; 
     } 
+0

यह एक आकर्षण की तरह काम किया। प्रस्तावित का सरल लेकिन केवल समाधान, जो मेरे लिए काम करता था। – Birk

3

मैं अपने आप को, जब एक DataGridView पर Enter कुंजी का डिफ़ॉल्ट व्यवहार को अक्षम करने, true को DataGridView.StandardTab की स्थापना करने के लिए एक समान प्रभाव प्राप्त करने में सक्षम होना चाहता हूँ। StandardTab सक्षम करने से उपयोगकर्ता को फ़ॉर्म में विभिन्न नियंत्रणों के बीच आसानी से नेविगेट करने में सक्षम बनाता है। यह ListBox की तरह व्यवहार करता है, खासकर यदि DataGridView में केवल एक कॉलम है। एंटर कुंजी का डिफ़ॉल्ट व्यवहार और व्यवहार जिसे मैं (nonexistent) DataGridView.StandardEnter कुंजी true पर सेट करने से अपेक्षा करता हूं, नियंत्रणों को रखने के लिए महत्वपूर्ण ईवेंट भेजना होगा, जिसके परिणामस्वरूप Form.AcceptButton सक्रिय हो रहा है। setting KeyEventArgs.SuppressKeyPress = true in DataGridView.KeyDown या not even firing DataGridView.KeyDown when the input key is Enter के प्रस्तावित तरीके "मानक" कुंजी व्यवहार दर्ज न करें; इन तरीकों के बजाय एंटर कुंजी ईवेंट निगलने दें।

निम्नलिखित दिखाता है कि मैंने डेटाग्रिड व्यू के बाहर "मानक" कुंजी व्यवहार (AcceptButton को उचित रूप से आमंत्रित करने सहित) प्राप्त करने में कामयाब रहा है। यह बदसूरत है क्योंकि मुझे Control.ProcessDialogKey() में तर्क चलाने के लिए एक बेहतर तरीका नहीं पता है (जो कि माता-पिता (कंटेनर) ProcessDialogKey() पर कॉल करने के लिए है या false लौटाएं यदि कोई अभिभावक नहीं है) इसे अपनी खुद की व्युत्पन्न कक्षा में कॉपी करने के बजाय । (मुझे अनिवार्य रूप से invalid/impossible base.base.ProcessDialogKey() syntax का उपयोग करने के लिए System.Windows.Forms क्लीनर तरीके से गैर-विस्तारशीलता के लिए काम करने की आवश्यकता है)। इस वजह से, मुझे मौजूद होने पर माता-पिता (कंटेनर) Control ऑब्जेक्ट की संरक्षित Control.ProcessDialogKey() विधि तक पहुंचने के लिए प्रतिबिंब का उपयोग करने के लिए मजबूर होना पड़ता है।

DataGridVew.IsInputKey()Keys.Enter के लिए true लौटाता है। यह इसे DataGridView.OnKeyDown() विधि में एंटर कुंजी देखने में सक्षम बनाता है जहां यह अंततः DataGridView.ProcessEnterKey() पर कॉल करता है जो DataGridView.EditMode की सेटिंग के आधार पर विभिन्न तरीकों से एंटर कुंजी पर प्रतिक्रिया करता है। लेकिन यह कुंजी ईवेंट को ProcessDialogKey() पर भेजने में भी अक्षम करता है, जहां से सामान्य नियंत्रण उनके माता-पिता को एंटर कुंजी ईवेंट को बबल करेगा (उदाहरण के लिए AcceptButton को काम करने में सक्षम बनाता है)। इस प्रकार, हम इस व्यवहार को IsInputKey() ओवरराइड करके वापस कर देते हैं और अब एंटर दबाए जाने पर DataGridView.ProcessDialogKey() कॉल किया जाएगा।

लेकिन यह पर्याप्त नहीं है। DataGridView.ProcessDialogKey() में DataGridView.ProcessEnterKey() पर एक हार्डकोडेड कॉल है और ProcessEnterKey() झूठी रिटर्न देता है तो केवल इसके आधार Control.ProcessDialogKey() पर कॉल करता है। इस बिंदु पर, ProcessEnterKey() को ओवरराइड करने के लिए सामान्य ज्ञान प्रतीत होता है, जो कि false वापस लौटाएगा जब हम मानक एंटर कुंजी व्यवहार चाहते हैं।लेकिन, हां, यह एक गैर वर्चुअल विधि है। इस प्रकार, हमें DataGridView.ProcessDialogKey() पर ओवरराइड करने के लिए मजबूर होना पड़ता है, और ProcessEnterKey() पर कॉल छोड़ते समय इसे फिर से कार्यान्वित किया जाता है। यह वह जगह है जहां हम सीधे Control.ProcessDialogKey() पर कॉल करने में असमर्थ हैं और माता-पिता/कंटेनर ऑब्जेक्ट की ProcessDialogKey() विधि को कॉल करने के लिए प्रतिबिंब का उपयोग करने के लिए मजबूर हैं। लेकिन एक बार जब हम सफलतापूर्वक उस कॉल को बनाते हैं, तो अंततः हमारे पास मानक एंटर व्यवहार होता है और AcceptButton पहुंच योग्य होता है, जबकि DataGridView पर ध्यान केंद्रित किया जाता है!

/// <summary> 
/// A DataGridView with a StandardEnter property which behaves 
/// like StandardTab. 
/// </summary> 
class StandardEnterDataGridView 
: DataGridView 
{ 
    /// <summary> 
    /// Like StandardTab but for the Enter key. 
    /// </summary> 
    [Category("Behavior"), Description("Disable default edit/advance to next row behavior of of the Enter key.")] 
    public bool StandardEnter { get; set; } 

    /// <summary> 
    /// Implement StandardEnter. 
    /// </summary> 
    protected override bool IsInputKey(Keys keyData) 
    { 
     if (StandardEnter && keyData == Keys.Enter) 
      // Force this key to be treated like something to pass 
      // to ProcessDialogKey() (like the Enter key normally 
      // would be for controls which aren’t DataGridView). 
      return false; 

     return base.IsInputKey(keyData); 
    } 

    private static MethodInfo _Control_ProcessDialogKey = typeof(Control).GetMethod("ProcessDialogKey", BindingFlags.Instance|BindingFlags.NonPublic); 

    protected override bool ProcessDialogKey(Keys keyData) 
    { 
     if (StandardEnter && keyData == Keys.Enter) 
      // Copy the default implementation of 
      // Control.ProcessDialogKey(). Since we can’t access 
      // the base class (DataGridView)’s base class’s 
      // implementation directly, and since we cannot 
      // legally access Control.ProcessDialogKey() on other 
      // Control object, we are forced to use reflection. 
      return Parent == null ? false : (bool)_Control_ProcessDialogKey.Invoke(Parent, new object[] {keyData, }); 

     return base.ProcessDialogKey(keyData); 
    } 
} 
+0

मैं बस अपनी नई कक्षा में इस नई कक्षा की घोषणा बदलता हूं लेकिन कुछ भी नहीं होता है, कुंजी दर्ज करें अभी भी अगली पंक्ति पर जा रहा है: -/ this.dbGride = new StandardEnterDataGridView(); – duardbr

+0

@duardbr मैंने इस कोड को लंबे समय तक नहीं देखा है, लेकिन यह देखते हुए कि आपने 'this.dbGride = new StandardEnterDataGridView() लिखा है; आपकी टिप्पणी में, क्या आपको' StandardEnter' प्रॉपर्टी को 'true' पर सेट करना याद आया ? शायद 'this.dbGride = नया standardEnterDataGridView {StandardEnter = true,};'। या यदि आप वीएस डिज़ाइनर का उपयोग कर रहे हैं तो डिज़ाइनर की संपत्ति ग्रिड व्यू में 'StandardEnter' प्रॉपर्टी को सक्षम करने का प्रयास करें। – binki

+0

उत्तर के लिए धन्यवाद, हाँ, मानकइंटर सही है और कुछ भी नहीं होता – duardbr

0

स्वीकृत समाधान मेरे लिए काम नहीं करता था। नीचे डीआईडी ​​कोड। http://www.vbforums.com/showthread.php?603242-Block-enter-key-in-datagridview-in-vb-net से: (मूल अज्ञात स्रोत)

Public Class clsDataGridView 
Inherits System.Windows.Forms.DataGridView 

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean 

    If keyData = Keys.Return Or keyData = Keys.Tab Then 
     If CurrentCellAddress.X = ColumnCount - 1 Then 
      keyData = Keys.Cancel 
      With msg 
       .WParam = CType(Keys.Cancel, IntPtr) 
      End With 
     Else 
      keyData = Keys.Tab 
      With msg 
       .WParam = CType(Keys.Tab, IntPtr) 
      End With 
     End If 
    End If 

    If keyData = (Keys.Shift Or Keys.Tab) Then 
     If CurrentCellAddress.X = 0 Then 
      keyData = Keys.Cancel 
      With msg 
       .WParam = CType(Keys.Cancel, IntPtr) 
      End With 
     End If 
    End If 
    Return MyBase.ProcessCmdKey(msg, keyData) 

End Function 

Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean 

    If keyData = Keys.Return Or keyData = Keys.Tab Then 
     If CurrentCellAddress.X = ColumnCount - 1 Then 
      keyData = Keys.Cancel 
     Else 
      keyData = Keys.Tab 
     End If 
    End If 

    If keyData = (Keys.Shift Or Keys.Tab) Then 
     If CurrentCellAddress.X = 0 Then 
      keyData = Keys.Cancel 
     End If 
    End If 
    Return MyBase.ProcessDialogKey(keyData) 

End Function 

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