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?

InformationsquelleAutor KallDrexx | 2011-02-23
Schreibe einen Kommentar