Laden...

[gelöst] DatagridView: Position des ContextMenuStrip immer korrekt berechnen

Erstellt von RogerSt vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.321 Views
R
RogerSt Themenstarter:in
60 Beiträge seit 2006
vor 14 Jahren
[gelöst] DatagridView: Position des ContextMenuStrip immer korrekt berechnen

Hallo Zusammen

Ich suche schon lange nach einer Lösung, die eigentlich einfach sein sollte, ich aber nicht hinkriege.

Leider habe ich auch mit Forumsuche und Google suche keine Lösung gefunden. (Vieleicht suche ichauch einfach Falsch)

Ich habe ein datagridview auf einer Form.
Nun schauen ich beim CellMouseUp event, wo die Maus steht und zeige dann das contextmenu an.
Ich berechne die Position anhand der sichtbaren Zellen.

Dies funktioniert auch gut.
Solange die erste Zelle ganz sichtbar ist.
Sobald diese nur noch zum Teil sichtbar ist, stimmt die Position der Contextmenus nicht mehr.

Weiss jemand, wie ich herausfinde, wie breit die erste Zelle ist?

Im Dateianhang habe ich noch ein Bild, wo es stimmt und eines, wos nicht stimmt.
Der Pfeil ist die Mausposition.

Bin für jeden Tip dankbar.

Gruss RogerSt

M
27 Beiträge seit 2010
vor 14 Jahren

Hallo,

ich habe mal kurz in der MSDN nachgeschaut und folgende Methode gefunden:

GetCellDisplayRectangle

Ich hoffe das hilft dir weiter.

Ansonsten wer es vileicht sinnvoll wenn du den Code von deiner Berrechnung postest.

R
RogerSt Themenstarter:in
60 Beiträge seit 2006
vor 14 Jahren

Hallo MotS

Das ist genau das, was ich gesucht habe.

Nun stimmt meine Positions berechnung.

VIELEN DANK.

Gruss RogerSt

K
62 Beiträge seit 2009
vor 14 Jahren

Was spricht dagegen das Menü einfach bei

Control.MousePosition

anzuzeigen, anstatt die Position der Maus extra nochmal zu berechnen (zumindest sieht dein Bild danach aus, dass Du das Menü doch an der Mausposition anzeigen möchtest)?

R
100 Beiträge seit 2009
vor 14 Jahren

@RogerSt: Wie Kileak schon sagte, finde ich diese Lösung eleganter


 private void dgvData_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                Point pMouse = dgvData.PointToClient(Control.MousePosition);
                cmsMenu.Show(dgvData, pMouse.X, pMouse.Y);
            }
        }

Nur eine Frage, warum setzt du nicht einfach ContextMenuStrip auf DatagridView wie unten? Dann musst du kein Code schreiben.

this.dgvData.ContextMenuStrip = this.cmsMenu;
R
RogerSt Themenstarter:in
60 Beiträge seit 2006
vor 14 Jahren

Danke rongchaua für deine Lösung.
Die ist wirklich super einfach.

Weiss auch nicht, wesshalb ich es so kompliziert mache.
Da ich nicht sehr häufig programmiere, schaue ich immerwieder in altem Code, den ich mal geschrieben habe.
(was nicht immer das schlauste ist)
Und wesshalb ich nicht die ContextmenuStrip auf dem Datagridview selber gesetzt habe, das Frage ich mich jetzt auch mehr, werds aber so machen.

Gruss RogerSt

T
94 Beiträge seit 2007
vor 14 Jahren
this.dgvData.ContextMenuStrip = this.cmsMenu;  

Ist sicherlich am einfachsten, nur wird das Kontextmenü zum Beispiel auch dann angezeigt, wenn die Maus sich im Überschriftenbereich befindet. Dann kann man schlecht dem Anwender anbieten 'Datei löschen'.

R
RogerSt Themenstarter:in
60 Beiträge seit 2006
vor 14 Jahren

Ich habe mein Problem nun doch mit folgenden Code gelöst.


        private void dgvGameInfo_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
        {
            if(e.ColumnIndex < 0 || e.RowIndex < 0)
            {
                return;
            }

            if (e.Button == MouseButtons.Right)
            {
                        Point pmouse = dgvGameInfo.PointToClient(Control.MousePosition);
                        contextMenuStrip1.Show(dgvGameInfo, pmouse.X, pmouse.Y);
            }
        }

So bin ich mit dem Ergebins ganz zufrieden und habe im Moment auch keine Situation gefunden, wo etwas nicht stimmt.

Gruss RogerSt