2017-06-02 30 views
0

Ich versuche, ein DataGridView-Objekt mithilfe eines Rechtsklickmenüs zu ändern.Menüeintrag Ereignishandler

Im Moment kann ich erfolgreich das Rechtsklickmenü erstellen und die Methode identifizieren, die aufgerufen wird, nachdem der Menüeintrag ausgewählt wurde. Die Zielmethode kann jedoch nicht auf Informationen darüber zugreifen, welcher Datensatz in der DataGridView ausgewählt wurde Element wurde ausgewählt - oder andere Informationen für diese Angelegenheit (es sei denn, es war eine Variable auf Klassenebene).

Mein Ziel ist es, einen Weg zu finden, entweder Informationen an die Zielmethode zu senden, oder eine Möglichkeit zu finden, das DataGridView-Objekt innerhalb derselben Methode zu ändern, die das Rechtsklick-Menü erstellt hat.

https://msdn.microsoft.com/en-us/library/system.windows.forms.menuitem(v=vs.110).aspx

 private void InspectionDataGridViewCellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      ContextMenu m = new ContextMenu(); 

       if (this.currentInspection != null) // the row that is being right-clicked might not be the row that is selected. 
       { 
        m.MenuItems.Add(new MenuItem(string.Format("Mark inspection point {0} as complete.", this.currentInspection.InspectionNumber), this.markInspectionPointComplete)); 
       } 
      m.Show(this.InspectionDataGridView, new Point(e.X,e.Y)); 
     } 
    } 

    private void markInspectionPointComplete(object sender, EventArgs e) 
    { 
     MessageBox.Show("the right-click menu works."); 
    } 

ich versuchte, die Zielmethode aufrufen Verwendung eines DataGridViewCellMouseEventArgs Objekts, aber das erzeugt einen Fehler mit dem m.MenuItems.Add() Linie, weil es nur erwartet ein EventArgs Objekt.

Also muss ich entweder das EventArgs-Objekt ändern, das gesendet wird, eine andere Methodensignatur finden, die diesen Zweck erfüllt, oder einen Weg finden, Aktionen in der DataGridView innerhalb derselben Methode auszuführen, die das Kontextmenü erstellt hat.

Vielen Dank im Voraus!

Antwort

1

Die einfachste Lösung besteht darin, die Eigenschaft 'Tag' des Objekts 'MenuItem' zu verwenden.

private void InspectionDataGridViewCellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     ContextMenu m = new ContextMenu(); 

     int currentRow = e.RowIndex; 
      if (this.currentInspection != null) // the row that is being right-clicked might not be the row that is selected. 
      { 
       var MI = new MenuItem(string.Format("Mark inspection point {0} as complete.", this.currentInspection.InspectionNumber), this.markInspectionPointComplete) 
       MI.Tag = e; 
       m.MenuItems.Add(MI); 
      } 
     m.Show(this.InspectionDataGridView, new Point(e.X,e.Y)); 
    } 
} 

private void markInspectionPointComplete(object sender, EventArgs e) 
{ 
    var MI = (MenuItem)sender; 
    DataGridViewCellMouseEventArgs Obj = (DataGridViewCellMouseEventArgs) MI.Tag; 

    // Do whatever you want with your Obj 

    MessageBox.Show("the right-click menu works."); 
} 

ODER

Verwenden Lambda-Ausdrücke wie folgt aus:

private void InspectionDataGridViewCellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     ContextMenu m = new ContextMenu(); 

     int currentRow = e.RowIndex; 
      if (this.currentInspection != null) // the row that is being right-clicked might not be the row that is selected. 
      { 
       var MI = new MenuItem(string.Format("Mark inspection point {0} as complete.", this.currentInspection.InspectionNumber)); 
       MI.Click += (s, x) => 
       { 
        // Use 'e' or 'sender' here 
       } 
       m.MenuItems.Add(MI); 
      } 
     m.Show(this.InspectionDataGridView, new Point(e.X,e.Y)); 
    } 
} 
+0

Zunächst sah es aus wie der "Tag" Lösung funktionieren könnte. Die Zuweisung von Tag scheint jedoch nicht angemessen zu sein. Ich habe versucht, die Zuweisung in einer neuen Zeile ohne geschweifte Klammern (*** MI.Tag = e ***) und es funktionierte so, wie ich es erwartet hatte. Der Lambda-Ausdruck sieht so aus, als ob er wie geschrieben funktionieren würde. – Sal