Laden...

ContextMenuStrip der DataGridViewRow: Strategie?

Erstellt von citizen.ron vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.031 Views
citizen.ron Themenstarter:in
432 Beiträge seit 2005
vor 16 Jahren
ContextMenuStrip der DataGridViewRow: Strategie?

hallo zusammen,

ich möchte, dass jede Zeile eines DataGridView ein eigenes Kontextmenü hat. Dabei zeigen die meisten Einträge ins Menü aber grundsätzlich auf den gleichen EventHandler.

Das Tag des Kontextmenüs speichert dabei momentan die DatGridViewRow, zu der sie gehört, damit ich beim Verarbeiten im EventHandler herausfinden kann, welche Zeile betroffen ist.

Derzeit verwende ich zur Zuweisung das RowPrePaint-Ereignis, um das Kontextmenü zuzuweisen.


protected virtual void DataGrid_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
// Allow row to get highlighted
   ToolStripMenuItem miHighlight;

// If row contains the row guid field...
   Guid guid = Guid.Empty;
   try
      { guid = (Guid)Rows[e.RowIndex].Cells[RowGuidColumnName].Value; }
   catch { }

// check if row is in highlight list
   if (guid != Guid.Empty) 
   {
      ContextMenuStrip cms = new ContextMenuStrip();
      if (_HighlightedRows.Contains(guid))
      {
         miHighlight = new ToolStripMenuItem("Markierung entfernen", null, tsiHighlight_Click);
      }
      else
         miHighlight = new ToolStripMenuItem("Eintrag markieren", null, tsiHighlight_Click);
      
      miHighlight.Tag = Rows[e.RowIndex];
      miHighlight.Name = "miHighlight";
      cms.Items.AddRange(new ToolStripMenuItem[] { miHighlight });
      Rows[e.RowIndex].ContextMenuStrip = cms;
   }
}

Frage 1:
Sollte der gesamte Code in eine Prüfung gewickelt werden, die zuerst prüft, ob das Kontextmenü nicht sowieso schon zugewiesen ist?
Das RowPrePaint-Ereignis greift ja nur für die zu zeichnenden Zeilen (=aktuell sichtbaren Zeilen) und wird doch also schlimmstenfalls für die gleichen Zeilen mehrmals aufgerufen, oder?

Frage 2:
Wie man sieht, geht es primär im obigen Beispiel darum, dass eine Zeilenmarkierung besteht und der Text sich danach richten muss.
Wäre es ein besserer Ansatz, auf das Ereignis RowContextMenuStripNeeded zu reagieren und das Menü dort erst zuzuweisen?
In diesem Fall "hätte" also die Zeile nicht ihr eigenes Kontextmenü, sondern bei Rechtsklick würde das einzige bestehende Kontextmenü mit ggf. angepasstem Text einfach angezeigt.

Danke für eure Meinung.

ron