Warum funktioniert meine WinForms-Kontextmenü nicht angezeigt, wo die Maus ist?
In meiner Anwendung habe ich eine DataGridView
ist dazu gedacht das konfigurieren einiger Optionen. Die Idee ist, dass Sie können geben Sie, was text Sie wollen in der ersten Spalte, aber wenn du mit der rechten Maustaste, es wird Ihnen ausdrücklich unterstützten Werte. Ich brauche diese eine textbox statt einer dropdown-Liste, denn ich brauche Unterstützung beim Bearbeiten ungültige (oder alte) Konfigurationen.
Was ich will, ist der Benutzer mit der rechten Maustaste in die Spalte Feldname, und haben ein Kontextmenü, das gültig ist, basierend auf welche Art von Konfiguration das ist. Deshalb habe ich codiert, das folgende Ereignis
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);
}
}
}
Das funktioniert "richtig", aber das Kontext-Menü erscheint am oberen Rand des Formulars, nicht dort, wo der Mauszeiger ist. Wenn ich die Show()
Anruf zu verwenden, die DataGridView
anstatt das Formular, ich habe das gleiche Problem, aber anstatt es erscheint in der oberen linken Ecke des Gitters, nicht wo die Maus ist.
Seltsam genug, wenn ich dieses Ereignis, um eine MouseClick
Veranstaltung (statt einer CellMouseclick
event) alles funktioniert und das Kontextmenü erscheint genau dort, wo der Mauszeiger ist. Das problem mit dieser option ist, dass der Benutzer möglicherweise nicht der rechten Maustaste auf die Zelle, die gerade ausgewählt, was bedeutet, dass, wenn Sie auf ein Menüelement klicken, wird die ausgewählte Zelle geändert wird und nicht die Zelle mit der rechten Maustaste auf.
Hat jemand irgendwelche Hinweise, warum die Kontext-Menüs erstellt mit der CellMouseClick
sind, zeigten nicht an der richtigen Stelle?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das 2. argument ist die Position der Maus relativ zum Zelle oberen linken Ecke. Wie programmiert, Sie machen das offset im Vergleich von diese, die form, die das Menü erscheint in der oberen linken Ecke des Formulars. Verwenden Sie die DGV als 1. argument funktioniert auch nicht, jetzt ist es in der linken oberen Ecke des Rasters.
Ein paar Möglichkeiten, um dieses Problem zu lösen, aber dies ist der einfache Weg:
Können Sie beliebig ersetzen diese mit grvFieldData.
Cursor.Position
ist das, was mir fehlte!In der datagridview-Maus-Klick-Ereignis:
versuchen
PointToClient
an die richtige StellePointToClient(e.Location)
stellt das Kontext-Menü am oberen Rand des Bildschirms, undPointToScreen(e.Location)
stellt das Kontext-Menü in der Mitte des Formulars aus irgendeinem Grund.this
AufrufgrvFieldData
:-/Es zeigt nicht in die richtige Stelle, weil e.Lage ist die Lage relativ zum übergeordneten Objekt wird die Obere linke Ecke, die in diesem Fall ist die Zelle selbst. Lage Eigenschaften sind immer relativ zu Ihrem container.
Um die position des Mauszeigers relativ zur oberen linken Ecke der form selbst, können Sie
Show()
) oder die Bildschirmposition der Maus?Ich dieses problem gelöst haben... diejenigen könnte diese Methode ist seltsam, aber es funktioniert !)
Wenn wir wollen, um zu sehen, ein Kontextmenü beim drücken der rechten Maustaste btn in das datagridview-Zelle, und genau dort, nicht in der Mitte des Bildschirms oder woanders, müssen wir:
einige Variablen
machen eine "MouseMove" - Veranstaltung für datagridview1 lke, dass:
und
Ihre willkommen