2010-08-25 21 views
5

में वृद्धिकर्ताओं और घटकों के रूप में + (प्लस) और - (शून्य) कुंजीपटल कुंजियों का उपयोग कर एक WinForms एप्लिकेशन पर जो मैं सी # में लिख रहा हूं, मेरे पास डेटाग्रिड व्यूटेक्स्टबॉक्स कॉलम है जिसमें पूर्णांक मान रखने वाले सेल हैं जिन्हें मैं चाहता हूं कि उपयोगकर्ता अपने कीबोर्ड से + और - कुंजी का उपयोग करके वृद्धि या कमी करने में सक्षम।डेटाग्रिड व्यू

मैंने कुंजीडाउन ईवेंट को संभाला है क्योंकि मैं आमतौर पर हटाए गए कुंजी को संभालने के लिए उपयोग करता हूं, लेकिन यह प्लस और माइनस कुंजी के लिए काम नहीं कर रहा है क्योंकि उन्हें दबाकर सेल को संपादन मोड में जाने का कारण बनता है, और परिणामस्वरूप उन कुंजी के लिए KeyDown ईवेंट कभी नहीं निकाल दिया जाता है। KeyPress ईवेंट

असल में, अगर मैं कोशिकाओं को केवल पढ़ने के लिए सेट करता हूं तो इसे निकाल दिया जाता है, लेकिन मैं इस समाधान से खुश नहीं हूं क्योंकि यह मुझे मेरे कोड के कई क्षेत्रों में संपत्ति को गलत से गलत करने के लिए मजबूर करेगा और जल्दी से गन्दा हो सकता है।

यह प्राप्त करने का सबसे अच्छा तरीका क्या होगा?

धन्यवाद।

उत्तर

2

डेटाग्रिड पहुंचने से पहले आपको कीस्ट्रोक को फंसाना होगा।

यह हैरत की बात है तुम क्या करने की कोशिश कर रहे हैं क्या के करीब लग रहा है: http://support.microsoft.com/kb/320584

+0

ठीक है, धन्यवाद। यह काम कर रहा है। दरअसल, केबी में जो दिखाया गया है उससे सरल समाधान यह है कि फ़ॉर्म की कीप्रेव्यू प्रॉपर्टी को सही पर सेट करना है और फिर फॉर्म की कीडाउन घटना को संभालना है। हालांकि यह काम करता है, इसमें कई कमियां हैं: DataGridView का कुछ तर्क डेटाग्रिड व्यू की घटनाओं के बजाय फॉर्म के संबंधित कार्यक्रमों में है। चूंकि सेल अभी भी इस समाधान के साथ संपादन मोड में जाता है, मुझे ट्रैक रखना था कि कुंजियों को दबाया गया था और बूल फ्लैग में सही कॉलम में, और सेलबेज एडिट ईवेंट को रद्द करना है अगर ध्वज इसे रोकने के लिए सही है संपादन मोड में जाने के लिए। –

+0

इस तथ्य के अलावा कि यह उतना ही सुरुचिपूर्ण नहीं है जितना मैं चाहता था, यह बहुत अच्छा काम करता है, इसलिए बहुत बहुत धन्यवाद। अगर मैं किसी और के पास अन्य सुझाव हो तो मैं इसे थोड़ी देर के लिए खोल दूंगा। –

2

वाह, यह KB लेख बहुत बुरा है। यह IsInputKey() को ओवरराइड करके किया जाना चाहिए।

मुझे डीजीवी के लिए ज्यादा परवाह नहीं है, यह अनुकूलित करने के लिए एक बगजर है।

using System; 
using System.Windows.Forms; 

class MyDgv : DataGridView { 
    public event EventHandler Increment; 
    public event EventHandler Decrement; 

    protected override void OnKeyDown(KeyEventArgs e) { 
     bool used = false; 
     if (this.EditingControl == null) { 
      if (e.KeyData == Keys.Oemplus) { 
       if (Increment != null) { Increment(this, EventArgs.Empty); used = true; } 
      } 
      else if (e.KeyData == Keys.OemMinus) { 
       if (Decrement != null) { Decrement(this, EventArgs.Empty); used = true; } 
      } 
     } 
     if (used) e.SuppressKeyPress = e.Handled = true; 
     else base.OnKeyDown(e); 
    } 
} 
+0

धन्यवाद, यह सुरुचिपूर्ण है। मैंने कोशिश की और यह काम करता है अगर मैं CellBeginEdit ईवेंट रद्द करता हूं। समस्या यह है कि DataGridView की OnKeyDown घटना CellBeginEdit ईवेंट के बाद ट्रिगर करती है, इसलिए मेरे पास यह निर्धारित करने का कोई तरीका नहीं है कि ईवेंट को रद्द करने के लिए उपयोगकर्ता द्वारा कौन सी कुंजी दबाई गई थी या नहीं। कोई उपाय? साथ ही, आप कहते हैं कि डीजीवी अनुकूलित करने के लिए एक दर्द है: मैंने सोचा कि यह पहली बार बहुत गहन था, लेकिन मैं सहमत हूं कि मैं जल्दी से इसकी सीमाओं में भाग रहा हूं? कोई तीसरा पक्ष सुझाव? मैंने जो भी कोशिश की है वह बहुत ही चमकीले/थीम्ड लगती है और मुझे डीजीवी की शैली पसंद आई क्योंकि यह अन्य WinForms नियंत्रणों के साथ अच्छी तरह से मिश्रण करता है। –

+0

यह * बिल्कुल * मेरा मतलब था, यह एक दर्द है। अगर आप कीस्ट्रोक का उपयोग करते हैं तो e.SuppressKeyPress और e. को सही पर सेट करें, मैं इसे शामिल करना भूल गया। पोस्ट अपडेट किया गया। –

+0

धन्यवाद, मैंने आपके नए कोड की कोशिश की है लेकिन समस्या यह है कि यदि उपयोगकर्ता द्वारा सेल को संशोधित किया जा सकता है तो वृद्धि और कमी ईवेंट हैंडलर ट्रिगर नहीं करते हैं।अगर मैं उन्हें केवल पढ़ने के लिए सेट करता हूं, तो घटनाएं होती हैं, लेकिन मेरे मामले में, उन्हें संशोधित करने की आवश्यकता होती है। ऐसा लगता है कि संपादन मोड में जाने वाला सेल ऑनकेडाउन विधि से पहले होता है, और इसे कभी भी चलने से रोकता है। मेरे मामले में, कोशिकाओं को उपयोगकर्ताओं द्वारा संशोधित किया जाना चाहिए। डेव के उत्तर कार्य के नीचे मेरी टिप्पणी में उपयोग की जाने वाली विधि, क्योंकि फॉर्म इवेंट किसी भी डीजीवी से पहले ट्रिगर होता है, लेकिन यह वास्तव में सुरुचिपूर्ण नहीं है जैसा मैंने कहा था। अपना काम करने का कोई तरीका? –

7

आप इस के साथ की कोशिश की है:

बजाय इस का उपयोग करने का: लेकिन आप शायद इस आकार के कुछ प्रकार में अजीब कर सकते हैं Keys.OemMinus उपयोग करें: Keys.Subtract

और बदले इसका उपयोग करने के लिए: Keys.Oemplus इसका उपयोग करें: Keys.Add

+0

ध्यान दें कि आपको मेरे लॉजिटेक के 120 कीबोर्ड 'की.ऑम्प्लस' और 'की.ऑममिनस' पर दोनों सेटों की जांच करने की आवश्यकता हो सकती है, संख्या पंक्ति पर [+] और [-] कुंजी के लिए हैं, और 'कुंजी। जोड़ें' और 'Keys.Subtract' संख्यात्मक कीपैड पर [+] और [-] कुंजी के लिए हैं। – jrh

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