2009-04-21 8 views
5

मेरे पास एक DataGridView है जो EditOnF2 पर सेट है। मैं CellEndEdit eventhandler में डेटा की कुछ विशेष प्रसंस्करण करता हूं जो सेल के मान को सेट करता है। जब भी एएससी कुंजी दबाया जाता है तब भी मैं मूल मूल्य पर वापस जाने के EditOnKeystrokeOrF2 की कार्यक्षमता चाहता हूं। दुर्भाग्यवश, CellEndEdit eventhandler पर, मुझे यह बताने का कोई तरीका नहीं दिख रहा है कि सेलएंडएडिट ईवेंट को किस कारण निकाल दिया गया था। यदि एएससी कुंजी दबाया नहीं जाता है तो मैं केवल सेल के मान को बदलना चाहता हूं। मैं कैसे बता सकता हूं कि यह था या नहीं?मैं उस कुंजीस्ट्रोक को कैप्चर कैसे कर सकता हूं जो C# में DataGridView पर "CellEndEdit" को ट्रिगर करता है?

संपादित करें: यह ध्यान देने योग्य है कि जब सेल संपादित किया जा रहा है, और न ही अंतिम समाप्ति कीस्ट्रोक के लिए कीडाउन घटना को निकाल दिया नहीं जाता है।

संपादित 2: मैंने KeyPreview सुझाव की कोशिश की है, लेकिन फ़ॉर्म अभी भी एस्केप कुंजी दबाए जाने पर कब्जा नहीं करता है।

संपादित 3: मैं इस काम को पाने की कोशिश कर प्रयोग कर रहा हूं। मैंने मूल रूप से निम्नलिखित में से कुछ को एक अलग पोस्ट के रूप में पोस्ट किया है, लेकिन ऐसा लगता है कि इसे यहां शामिल करना अधिक प्रासंगिक हो सकता है।

मेरे पास डेटाग्रिड व्यू में एक सेल है जो अब संपादन प्रोग्रामैटिक रूप से सेट है। उसस्ट्रोक को कैप्चर करने के लिए जो एक संपादन शुरू करता है, मैं सेल सेट कर रहा हूं। कीस्ट्रोक के बराबर वैल्यू। हालांकि, यह सेल की "एस्केप" कार्यक्षमता को खंडित करता है - जब आप मूल मूल्य पर वापस जाने के बजाय भागते हैं, तो यह उस कुंजीस्ट्रोक पर वापस आ जाता है जिसे मैंने सेल में प्रोग्रामेटिक रूप से डाला है।

मुझे विश्वास है कि अगर मैं एक सेल पर "संपादित फ़ॉर्मेटेड वैल्यू" सेट कर सकता हूं, तो यह वह जगह होगी जहां मैं अपना कीस्ट्रोक मान रखना चाहता हूं, हालांकि यह केवल पढ़ने के लिए प्रतीत होता है। मैं जो कोशिश कर रहा हूं उसे पूरा कैसे कर सकता हूं?

स्पष्टीकरण के लिए एक उदाहरण: यदि सेल में "54.3" का मान है, और मैं "9" कुंजी दबाता हूं, तो यह सेल को संपादित करना शुरू करता है और वहां "9" रखता है। अगर मैं एस्केप हिट करता हूं, तो इसे "54.3" पर वापस करने के बजाय इसे "9" पर वापस लाया जाता है। मैं चाहता हूं कि यह "54.3" के मूल मूल्य पर वापस आ जाए।

तो, मैं इस मुद्दे को शुरुआत और अंत दोनों से निपटने की कोशिश कर रहा हूं। मुझे लगता है कि वास्तविक समस्या यह है कि मैं मूल मूल्य को ओवरराइट कर रहा हूं और यह निर्धारित करने का कोई तरीका नहीं है कि मुझे इसे वापस करना चाहिए या नहीं।

संपादित 4: ऐसा लगता है कि सेल वैलिडेटिंग का उपयोग करने लायक हो सकता है, लेकिन जब मैं इसका प्रयोग करता हूं तो मुझे अजीब व्यवहार दिखाई देता है। एक नई परियोजना में, मैं डेटाग्रिड व्यू बनाता हूं और विभिन्न कार्यक्रमों के लिए पंजीकरण करता हूं और देखता हूं कि CellValidating को CellEndEdit से पहले निकाल दिया गया है। हालांकि, मेरे प्रोजेक्ट में जहां मैं इसे काम करने की कोशिश कर रहा हूं, सेलएंडएडिट सेल वैलिडेटिंग से पहले फायरिंग कर रहा है। अंतर क्या हो सकता है पर कोई विचार?

उत्तर

2

अपने फॉर्म पर KeyPrevew property सेट करें; जो नियंत्रण को पहले इसे पकड़ने से रोक देगा। :)

+0

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

0

सबसे पहले, आप बिल्कुल सही हैं, KeyPreview काम नहीं करेगा। सबसे पहले, मैंने सोचा कि मैं फॉर्म के IsInputKey विधि को ओवरराइड करके इसे प्राप्त कर सकता हूं। इस तकनीक ने मेरे लिए कुछ अन्य मामलों में काम किया है जहां मुझे पकड़ने के लिए आवश्यक कुंजी नहीं मिल सका। यह या तो काम नहीं करता था, इसलिए मैंने DataGridView को उपclassing और IsInputKey ओवरराइड करने की कोशिश की। वह या तो काम नहीं किया। कुछ अन्य विधियों के माध्यम से खोदने के बाद मैं ओवरराइड कर सकता था, मैंने सीखा कि चाबियों की एक और वर्ग थी जिसे कमांड कुंजियां कहा जाता था जिन्हें मुझे रोकना था। ऐसा करने के लिए, अपने DataGridView पर ProcessCmdKey ओवरराइड करें (आपको इसे उपclass करने की आवश्यकता होगी)।

public class CommandKeyInterceptingDataGridView : DataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     Debug.WriteLine(keyData); 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

और, F2 साथ संपादन मोड में प्रवेश करने के लिए एक सेल को संशोधित करने को कहते हैं "नमस्ते" और भागने के साथ संपादित रद्द करने से उत्पादन:

यहाँ मेरी कोड है।

F2 
ShiftKey, Shift 
H, Shift 
E 
L 
L 
O 
Escape 

उम्मीद है कि यह आपको जो चाहिए वह आपको देता है।

Problem: उपयोगकर्ता संपादन DGV में एक सेल मूल्य शुरू कर दिया और ESC कुंजी दबाया मूल्य EndEdit करने से पहले जब बुलाया जा रहा था, जो डेटाबेस के लिए सभी DGV क्षेत्रों को फिर से लिखा है:

0

मेरे समस्या समान था, यहाँ मेरी समाधान नहीं है इस प्रकार अद्यतन दिनांक & समय फ़ील्ड अपडेट कर रहा है, मैं केवल डीजीवी.एंडएडिट चाहता था जब उपयोगकर्ता वास्तव में मूल्य बदल गया और ऐसा करने के दौरान ईएससी दबाया नहीं।

Solution: सेल मान्यता में मैं जाँच करने के लिए this की तरह एक ध्वज का इस्तेमाल किया है, तो मूल्य बदल गया है और अगर झंडा मूल्य गलत है सिर्फ EndEdit पर एक if(!flag)return; कर

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

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