Kontextmenü auf DataGridview per Tastatur und Maus?

21/04/2009 - 16:48 von Jens Ansorg | Report spam
hallo,

ich kàmpfe gerade mit Kontextmenü auf DataGridView. Habe ausreichend
Beispiele gefunden die mir zeigen wie das grundsàtzlich geht. Mir
scheint aber daß all diese Beispiele von reiner Mausbedienung ausgehen.

Nun gibt es aber auf der üblichen Windows-PC-Tastatur auch eine Taste
(mit einem stilisierten Kontextmenü-Icon) die das Kontextmenü öffnet
(falls vorhanden).

Das öffnen passiert auch in einem DataGridView - doch leider anscheinend
ohne Bezug zur Zeile/Zelle in der sich der Tastaturkursor beim
Aktivieren befindet: Das Kontextmenü klappt immer horizontal und
vertikal zentriert über dem DataGridView auf und nicht da wo ich es
erwarten würde.

Jemand einen Tip wie man das richtig hinkriegt?


Danke
Jens
 

Lesen sie die antworten

#1 Frank Dzaebel
21/04/2009 - 18:41 | Warnen spam
Hallo Jens,

... eine Taste (mit einem stilisierten Kontextmenü-Icon)
die das Kontextmenü öffnet (falls vorhanden).



-> Keys.Apps


Das öffnen passiert auch in einem DataGridView -
doch leider anscheinend ohne Bezug zur Zeile/Zelle.



ja, by design ist nicht klar, was gemennt sein sollt.
Die selektierte CurrentCell wàre zum Beispiel
ein Kandidat. Dafür ein Beispiel, wobei der
contextMenuStrip1 und ..2 angelegt sein soll, mit
der Mainstream-Semantik Spalten-bezogenes
Kontextmenü:


DataGridView dgv = new DataGridView();

private void Form1_Load(object sender, EventArgs e)
{
Controls.Add(dgv);
dgv.Dock = DockStyle.Fill;
dgv.Columns.Add("Spalte1", "Spalte1");
dgv.Columns.Add("Spalte2", "Spalte2");
dgv.Rows.Add("Wert00", "Wert01");
dgv.Rows.Add("Wert10", "Wert11");
dgv.Columns[0].ContextMenuStrip = contextMenuStrip1;
dgv.Columns[1].ContextMenuStrip = contextMenuStrip2;
dgv.KeyDown +=new KeyEventHandler(dgv_KeyDown);
}

int rightMinus = 15;
const int topPlus = 8;

private void dgv_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Apps)
{
DataGridViewCell c = dgv.CurrentCell;
Rectangle currCellRec = dgv.GetCellDisplayRectangle(
c.ColumnIndex, c.RowIndex, true);
ContextMenuStrip cms = c.
GetInheritedContextMenuStrip(c.RowIndex);
cms.Show(this, new Point(currCellRec.Right - rightMinus,
currCellRec.Top + topPlus));
e.Handled = true;
}
}


ciao Frank
Dipl. Inf. Frank Dzaebel [MCP, MVP C#]
http://Dzaebel.NET

Ähnliche fragen