Kontextmenü Datagridview

  • VB.NET

    Kontextmenü Datagridview

    Hallo,
    ich habe ein Problem mit dem Kontextmenü bei einem Datagridview.

    Klicke ich mit der rechten Maustaste in das dgv, dann öffnet sich das Kontextmenü, aber die darunterliegende Zelle wird nicht markiert. Ich möchte aber, dass diese Zelle markiert wird. Außerdem soll, wenn sich darunter keine Zelle befindet sich ein anderes Kontextmenü öffnen. Vielleicht wisst ihr, wie ich das bewerkstelligen kann.

    Danke für eure Antworten!


    Gruß
    Manuel
    Ok, sorry wenns nicht klar ist!

    Hab bis jetzt ein ContextMenuStrip erstellt und die Menüpunkte eingetragen. In dem Datagridview hab ich unter der Eigenschaft "ContextMenuStrip" das erstellte ContextMenu eingetragen.

    Nun zum Problem. Egal wo ich im dgv mit der rechten Maustaste hinklicke öffnet sich das ContextMenu, aber die Zelle, welche "angeklickt" wird, wird nicht ausgewählt. Das heißt, ich kann dadurch nicht feststellen welche Zelle dabei gemeint ist und mit dieser weiterarbeiten z.B. diesen Datensatz in einem anderen Formular anzeigen wenn "Öffnen" geklick wird im ContextMenu. Das ist erstmal das Hauptproblem. Also wie bekomm ich heraus, auf welche Zelle mit der rechten Maustaste geklickt wird und wie wähle ich die Zelle per Programm aus?

    Hoffe dies ist verständlicher.


    Gruß
    OK
    nun habe ich es auch verstanden.

    Ich habe mal schnelle in DGV und ein ContMenü.. gestrickt.
    Wenn ich dort mit der Mouse eine Celle oder auch eine Zeile markieren. Wie bei Excel oder..
    Dann kann ich ohne weiteres das ContextMenü bedienen ohne das sich an der markierung etwas ändert.

    Also bis dahin ist da so gewollt.

    Nun sollte die markierte Celle irgendwo angezeigt werden.

    Dazu schaust du dir die "CurrentCell" mal an.


    Dann kann ich ohne weiteres das ContextMenü bedienen ohne das sich an der markierung etwas ändert.
    Genau das ist der Punkt, ich möchte aber, dass sich die Markierung ändert beim klicken mit der rechten Maustaste auf eine andere Zelle und dabei soll sich das ContextMenü öffnen. Weil derzeit ist es so, dass ich mit dem klick der rechte Maustaste das Contextmenü öffnet egal wohin ich im dgv klicke, aber sich die Markierung der Zelle nicht verändert. Erst durch den klick mit der linkten Maustaste wird die Zelle markiert.
    ich habe dich glaube ich vertanden.
    kurz:
    beide Events bei einem Click auf der rechten Maustaste.

    1. Event Celle aussuchen
    2. ContextMenü öffnen

    Dann geht die strickerei los.
    Das DGV ist dafür so nicht vorgesehen.

    Nun solltest du dir eine Routine suchen, die es dir ermöglicht die Celle unter der Maus zu ermitteln.
    Wenn du die hast leitest du deine Events so um das sie nacheinander erfolgen.
    So ich habe mal gebastelt.
    Wir arbeiten mit dem KeyDown Envent

    VB.NET-Quellcode

    1. Private Sub DataGridView1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown
    2. If e.Button <> MouseButtons.Right Then
    3. Return
    4. End If
    5. Dim hti As DataGridView.HitTestInfo = DataGridView1.HitTest(e.X, e.Y)
    6. If hti.Type = DataGridViewHitTestType.Cell Then
    7. DataGridView1.CurrentCell = DataGridView1(hti.ColumnIndex, hti.RowIndex)
    8. DataGridView1.CurrentCell.Selected = True
    9. ' Nun ist logischerweise das Ergebnis z.B. : Row Nr. 0 und Colum Nr. 1 die Markierte Zelle
    10. DataGridView1.CurrentCell.Value = "Row " & hti.RowIndex.ToString & "Colum " & hti.ColumnIndex.ToString
    11. End If
    12. End Sub

    Nun ist deine Celle´markiert.

    Dann gehst über den Button:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim A As Integer = DataGridView1.RowCount - 1
    3. Dim B As Integer = DataGridView1.ColumnCount - 1
    4. For i = 0 To A
    5. For g = 0 To B
    6. If DataGridView1.Rows(i).Cells(g).Selected = True Then
    7. DataGridView1.Rows(i).Cells(g).Value = "Row " & i.ToString & " Cell " & g.ToString
    8. End If
    9. Next
    10. Next
    11. End Sub



    Beides liefert dir den Wert von Row und Column in der markierten Celle.
    Du könntest auch beide vereinen.

    Die Werte nicht in die Celle reinschreiben, sondern in Variable speichern.

    viel spass

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ChaosBernd“ ()