2011-02-23 16 views
6

मेरे आवेदन में मेरे पास DataGridView है जो कुछ विकल्पों को कॉन्फ़िगर करने के लिए है। विचार यह है कि आप पहले कॉलम में जो भी टेक्स्ट चाहते हैं उसे दर्ज कर सकते हैं, लेकिन यदि आप राइट क्लिक करते हैं तो यह आपको स्पष्ट रूप से समर्थित मान देगा। मुझे ड्रॉपडाउन सूची के बजाय टेक्स्टबॉक्स होने की आवश्यकता है क्योंकि मुझे अमान्य (या पुरानी) कॉन्फ़िगरेशन संपादित करने का समर्थन करने की आवश्यकता है।मेरा WinForms संदर्भ मेनू क्यों प्रकट नहीं होता है जहां माउस है?

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

private void grvFieldData_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     // If this is a right click on the Field name column, create a context menu 
     // with recognized options for that field 
     if (e.Button == MouseButtons.Right && grvFieldData.Columns[e.ColumnIndex].Name == "clmFieldName") 
     { 
      ContextMenu menu = new ContextMenu(); 

      if (_supportedDataGrids.ContainsKey((cmbDataGrid.SelectedItem as DataGridFieldList).GridName)) 
      { 
       // Loop through all the fields and add them to the context menu 
       List<string> fields = _supportedDataGrids[((cmbDataGrid.SelectedItem as DataGridFieldList).GridName)]; 
       fields.Sort(); 

       foreach (string field in fields) 
        menu.MenuItems.Add(new MenuItem(field)); 

       // Make sure there is at least one field before displaying the context menu 
       if (menu.MenuItems.Count > 0) 
        menu.Show(this, e.Location, LeftRightAlignment.Right); 
      } 
     } 
    } 

यह "सही ढंग से" काम करता है कोडित है, लेकिन संदर्भ मेनू प्रारूप में सबसे ऊपर दिखाई दे रहा है, नहीं माउस सूचक है, जहां। यदि मैं Show() को फॉर्म के बजाय DataGridView का उपयोग करने के लिए कॉल करता हूं, तो मेरे पास एक ही समस्या है लेकिन इसके बजाय यह ग्रिड के ऊपरी-बाएं कोने में दिखाई देता है, जहां माउस नहीं है।

विचित्र रूप से पर्याप्त है, अगर मैं इस घटना को MouseClick ईवेंट (CellMouseclick ईवेंट के बजाय) में बदलता हूं तो सबकुछ काम करता है और संदर्भ मेनू बिल्कुल ठीक होता है जहां माउस पॉइंटर होता है। इस विकल्प के साथ समस्या यह है कि उपयोगकर्ता वर्तमान में चुने गए सेल पर सही क्लिक नहीं कर सकता है, जिसका अर्थ है कि जब वे मेनू आइटम पर क्लिक करते हैं, तो चयनित सेल बदल दिया जाएगा और वह सेल नहीं जिस पर उन्होंने दायाँ क्लिक किया था।

क्या किसी के पास कोई संकेत है कि CellMouseClick के साथ बनाए गए संदर्भ मेनू सही स्थान पर क्यों नहीं दिख रहे हैं?

उत्तर

17
menu.Show(this, e.Location, LeftRightAlignment.Right); 

2 तर्क माउस स्थान, सेल की के सापेक्ष है ऊपरी बाएँ कोना। प्रोग्राम किए गए के रूप में, आप उस ऑफसेट को से से संबंधित ऑफ़सेट बनाते हैं, यह फ़ॉर्म, जो फॉर्म के ऊपरी बाएं कोने में मेनू को दिखाएगा। डीजीवी का प्रयोग करें क्योंकि पहला तर्क काम नहीं करता है, अब यह ग्रिड के ऊपरी बाएं कोने में है।

तरीके इसे ठीक करने के एक जोड़े, लेकिन यह आसान तरीका है:

Point pos = this.PointToClient(Cursor.Position); 
menu.Show(this, pos, LeftRightAlignment.Right); 

आप मनमाने ढंग से grvFieldData के साथ इस बदल सकते हैं।

+0

हे, मेरा जवाब एक्स और वाई निर्देशांक जोड़ने के समूह के साथ थोड़ा और जटिल हो रहा था। काश मैं कर्सर के बारे में जानता हूं। कुछ हफ्ते पहले! सादगी के लिए +1! – Yetti

+0

बहुत बढ़िया, यह एक आकर्षण की तरह काम किया! 'कर्सर। स्थिति' वह है जो मैं याद कर रहा था! – KallDrexx

1

PointToClient उपयोग करने के लिए उचित स्थान

+0

नहीं। 'प्वाइंटटॉक्लिएंट (ई। लोकेशन) 'स्क्रीन के शीर्ष पर संदर्भ मेनू रखता है, और' प्वाइंटटोक्रीन (ई। लोकेशन) 'संदर्भ मेनू को किसी कारण से फ़ॉर्म के बीच में रखता है। – KallDrexx

+0

grvFieldData.PointToClient (e.Location) – Stecya

+0

वही समस्या, भले ही मैं अपना 'यह' कॉल 'grvFieldData' में बदलूं: -/ – KallDrexx

1

यह सही स्थान पर प्रदर्शित न होने के वजह से e.Location पैरेंट ऑब्जेक्ट के ऊपरी-बाएं कोने, जो इस मामले में सेल ही है करने के लिए स्थान रिश्तेदार है प्राप्त करने की कोशिश। स्थान गुण हमेशा उनके कंटेनर के सापेक्ष होते हैं।

प्रपत्र पर ही के ऊपरी-बाएं करने के लिए माउस कर्सर रिश्तेदार की स्थिति को प्राप्त करने के लिए, आप उपयोग कर सकते

this.PointToClient(Cursor.Position); 
+0

मैं या तो क्लिक किए गए सेल का स्थान कैसे प्राप्त कर सकता हूं (सेल नियंत्रण नहीं कर रहे हैं मैं इसे 'शो() ') या माउस के स्क्रीन स्थान में नहीं पारित कर सकता हूं? – KallDrexx

+0

मेरा संपादित उत्तर देखें। – MartW

1

मैंने इस समस्या को हल किया है ... कोई भी इस विधि को अजीब ढूंढ सकता है, लेकिन यह ठीक काम करता है!) हम एक संदर्भ मेनू देखने के लिए, जबकि DataGridView कक्ष में सही माउस btn दबाने, और वहीं, स्क्रीन या कहीं और के बीच में नहीं हैं, तो हम की जरूरत है:

कुछ चर बनाने

int x=0; 
int y=0; 

कि lke datagridview1 के लिए एक 'MouseMove' घटना बनाने:

private void dataGridView1_MouseMove(object sender, MouseEventArgs e) 
{ 
    x = e.X; 
    y = e.Y; 
} 

और

private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
    { 
     contextMenuStrip1.Show(dataGridView1, x,y); 
    } 
} 

अपने स्वागत

+0

इस समाधान में अनावश्यक ओवरहेड है, क्योंकि उपयोगकर्ता अपने माउस को ग्रिड पर ले जाता है (जो मुझे लगता है कि अक्सर पर्याप्त होता है) यह लगातार स्मृति को लिखता रहेगा। घटना में पहले से ही स्थान शामिल है। –

3

DataGridView माउस क्लिक घटना में:

if e.button= mousebutton.right 
{ 
    contextmenu1.Show(MousePosition); 
} 
संबंधित मुद्दे