में डिफ़ॉल्ट एंटर/रिटर्न कुंजी व्यवहार अक्षम करें vb.net डेटाग्रिडव्यू में डिफ़ॉल्ट प्रविष्टि/वापसी कुंजी व्यवहार अगली पंक्ति में जाने के लिए है, इससे बचने के लिए एक त्वरित और आसान तरीका है।डेटाग्रिडव्यू
कोई सुझाव का स्वागत करते
में डिफ़ॉल्ट एंटर/रिटर्न कुंजी व्यवहार अक्षम करें vb.net डेटाग्रिडव्यू में डिफ़ॉल्ट प्रविष्टि/वापसी कुंजी व्यवहार अगली पंक्ति में जाने के लिए है, इससे बचने के लिए एक त्वरित और आसान तरीका है।डेटाग्रिडव्यू
कोई सुझाव का स्वागत करते
आप घटना
Private Sub DataGridView1_Keydown (...) Handlers DataGridView1.KeyDown
If e.KeyCode = Keys.Enter Then
' Your code here
e.SuppressKeyPress = True
End If
End Sub
gridview कुंजी दबाए में कुछ इस तरह की कोशिश कर सकते हैं एक और विकल्प एक कस्टम ग्रिड दृश्य नियंत्रण
डेटाग्रिड व्यू को ओवरराइड करें (अपना खुद का लिखें जो उससे प्राप्त होता है), और ऑनके को संसाधित करें yDown विधि।
public partial class UserControl1 : DataGridView
{
public UserControl1()
{
InitializeComponent();
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
return;
base.OnKeyDown(e);
}
}
तुम बस कुंजी दबाने घटना का उपयोग कर सकते हैं:
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
//You're Code
}
e.Handled = true;
return;
}
यह एक आकर्षण की तरह काम किया। प्रस्तावित का सरल लेकिन केवल समाधान, जो मेरे लिए काम करता था। – Birk
मैं अपने आप को, जब एक 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);
}
}
मैं बस अपनी नई कक्षा में इस नई कक्षा की घोषणा बदलता हूं लेकिन कुछ भी नहीं होता है, कुंजी दर्ज करें अभी भी अगली पंक्ति पर जा रहा है: -/ this.dbGride = new StandardEnterDataGridView(); – duardbr
@duardbr मैंने इस कोड को लंबे समय तक नहीं देखा है, लेकिन यह देखते हुए कि आपने 'this.dbGride = new StandardEnterDataGridView() लिखा है; आपकी टिप्पणी में, क्या आपको' StandardEnter' प्रॉपर्टी को 'true' पर सेट करना याद आया ? शायद 'this.dbGride = नया standardEnterDataGridView {StandardEnter = true,};'। या यदि आप वीएस डिज़ाइनर का उपयोग कर रहे हैं तो डिज़ाइनर की संपत्ति ग्रिड व्यू में 'StandardEnter' प्रॉपर्टी को सक्षम करने का प्रयास करें। – binki
उत्तर के लिए धन्यवाद, हाँ, मानकइंटर सही है और कुछ भी नहीं होता – duardbr
स्वीकृत समाधान मेरे लिए काम नहीं करता था। नीचे डीआईडी कोड। 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
यह आकर्षण – Ramji
+1 तरह काम करता है यह मैं क्या जरूरत है। धन्यवाद – gyurisc
एप्लिकेशन e.suppressKeyPress = true के रूप में जल्द ही समाप्त हो जाता है। – Kenta