DataGridView mit ContextMenuStrip

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    DataGridView mit ContextMenuStrip

    Hallo,

    ich bin ein Anfänger in C#,
    Mein Ziel ist in einem DatenGridView mit ein Context Menü Eintrag (Ping) einen Wert aus der Zelle aus der der DatenGridView auslesen.

    Den Wert Kopieren klappt aus den Context Menü mit "Kopieren", aber mit den Punkt "Ping" aus den Kontext Menü den Wert der markierten Zelle auszugeben geht nicht, es kommt immer zu einem Fehler im Designer


    C#-Quellcode

    1. Designer
    2. // pingToolStripMenuItem1
    3. //
    4. this.pingToolStripMenuItem1.Name = "pingToolStripMenuItem1";
    5. this.pingToolStripMenuItem1.Size = new System.Drawing.Size(180, 22);
    6. this.pingToolStripMenuItem1.Text = "Ping";



    Hier kommt es zu einen Fehler

    C#-Quellcode

    1. this.pingToolStripMenuItem1.Click += new System.EventHandler(this.pingToolStripMenuItem1_Click);



    C#-Quellcode

    1. namespace admintool_c
    2. {
    3. public partial class FORM_VIDEO : Form
    4. {
    5. public FORM_VIDEO()
    6. {
    7. InitializeComponent();
    8. }
    9. private void CMD_CLOSE_Click(object sender, EventArgs e)
    10. {
    11. Close();
    12. }
    13. private void FORM_VIDEO_Load(object sender, EventArgs e)
    14. {
    15. var con = new OleDbConnection();
    16. var cmd = new OleDbCommand();
    17. string DB;
    18. string dbpassword;
    19. DGV.ContextMenuStrip = contextMenuStrip1;
    20. // Datenbank live
    21. DB = @"C:\Admintool\Datenbank\";
    22. dbpassword = "";
    23. var ds = new DataSet();
    24. var dt = new DataTable();
    25. ds.Tables.Add(dt);
    26. var da = new OleDbDataAdapter();
    27. con.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + DB + "pwdb.accdb; Jet OLEDB:Database Password=" + dbpassword;
    28. con.Open();
    29. da = new OleDbDataAdapter("select id as Id, beschreibung as Beschreibung, link as Link, benutzer as Benutzer, password as Passwort, bezeichnung as Bezeichnung , info as Info from tabvideo ORDER by id ASC", con);
    30. da.Fill(dt);
    31. DGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    32. DGV.AutoResizeColumns();
    33. DGV.DataSource = dt.DefaultView;
    34. con.Close();
    35. }
    36. private void pingToolStripMenuItem1_Click(object sender, DataGridViewCellEventArgs e)
    37. {
    38. string abc = DGV[e.ColumnIndex, e.RowIndex].Value.ToString();
    39. MessageBox.Show(abc);
    40. }
    41. private void kopierenToolStripMenuItem1_Click(object sender, EventArgs e)
    42. {
    43. DGV.GetClipboardContent();
    44. if (this.DGV.GetCellCount(DataGridViewElementStates.Selected) > 0)
    45. Clipboard.SetDataObject(this.DGV.GetClipboardContent());
    46. }
    47. }
    48. }


    unvollständige CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „jnpanzer“ ()

    Kann ich nicht nachvollziehen. Hab ein leeres DGV, ein CMS mit dem Ping-TMS und Deinen ping-ControlCode. Läuft.

    Kannst Du mal bitte das abgespeckte Projekt ohne bin-, obj-, .vs- und .git-Ordner und gezippt über [+ Erweiterte Antwort] hochladen? Vielleicht finden wir so das Problem und eine Lösung.
    Wie lautet denn eigentlich die Designer-Fehlermeldung?
    Bilder
    • CMS.png

      15,65 kB, 774×478, 45 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    jnpanzer schrieb:

    private void pingToolStripMenuItem1_Click(object sender, DataGridViewCellEventArgs e)


    Nimm auch die richtigen Argumente. Es kommen System.EventsArgs rein, nicht DataGridViewCellEventArgs.
    Das änderst du:

    C#-Quellcode

    1. private void pingToolStripMenuItem1_Click(object sender, DataGridViewCellEventArgs e)

    zu:

    C#-Quellcode

    1. private void pingToolStripMenuItem1_Click(object sender, EventArgs e)


    Dann geht das. Du solltest am besten immer die exakte Fehlermeldung posten, dann hätte Vaporized das sicher auch sofort bemerkt. Nur die Zeile wo der Fehler auftritt ist weniger optimal, kann viele Ursachen haben, wie hier, ganz wo anders, als die bemängelte Zeile.
    Hallo Takafusa,

    das hatte ich auch schon gehabt, danach wird das Context Menü "Ping" nicht mehr ausgeführt.

    Hallo VaporiZed,
    Fehlermeldung

    Schweregrad Code Beschreibung Projekt Pfad Datei Zeile Spalte Unterdrückungszustand
    Fehler CS0123 Keine Überladung für "pingToolStripMenuItem1_Click" stimmt mit dem Delegaten "EventHandler" überein. admintool_c C:\c#_projekt\admintool_c\admintool_c C:\c#_projekt\admintool_c\admintool_c\Form2.Designer.cs 86 50 Aktiv






    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jnpanzer“ ()

    Irgendwas passt dann nicht ganz. Wie Vaporized sagte, häng mal eine Projektmappe an. Bei mir funktioniert das wie bei VaporiZed auch einwandfrei.

    Edit @jnpanzer die SLN Datei hättest du im Projekt lassen sollen, so ist das umständlich. Nur die erwähnten Ordner löschen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Takafusa“ ()

    Wie takafusa sagte: EventHandler-Kopf anpassen, fertig ist der Lack.
    private void pingToolStripMenuItem1_Click(object sender, EventArgs e)

    Ich musste noch das Video-Laden deaktivieren (weil die Daten fehlen), das CMS mit dem DGV verbinden (weil die nicht aneinander gekoppelt waren) und den Methodeninhalt ändern (weil man ja über die EventArgs eben nicht auf das DGV zugreifen kann), aber dann läuft's.

    Auf den DGV-Inhalt musst Du dann anders zugreifen, z.B. über DGV.CurrentCell.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    War aber nicht die SLN Datei drin, ist aber egal, hab einfach einneues Projekt erstellt und dein Projekt in dem neuen hinzugefügt.

    Dein Problem ist wohl eher das hier:

    C#-Quellcode

    1. string abc = DGV[e.ColumnIndex, e.RowIndex].Value.ToString();


    EventArgs hat nun mal keinen Member ColumnIndex oder RowIndex. Also nicht mehr ausgeführt stimmt also nicht, gibt eine neue andere Fehlermeldung.

    Erklär mal genau was dein Ziel ist, was genau soll wann passieren.
    Erst mal Danke für Euere Hilfe
    Ich habe es jetzt richtig hochgeladen.

    Ich will ein DGV erstellen da ist eine IP Adresse in der Liste

    Ich will
    1. die Zelle und Spalte mit der IP auswählen
    2. mit Rechtsklick das Kontext Menü starten
    3. den Menü Punkt "Ping" im Kontext Menü auswählen
    4. Es soll danach eine Message Box mit dem Wert der Zelle fürs Erste ausgegeben werden.


    *******************************************************************************************************************

    Der Tipp mit DGV.CurrentCell war ein Schubser in die richtige Richtung,
    Ich habe es hinbekommen.

    Ihr seit super Danke für die tolle schnelle Hilfe.

    Ist ausbaufähig aber das ist die Lösung ...


    C#-Quellcode

    1. int row = DGV.CurrentCell.RowIndex;
    2. int column = DGV.CurrentCell.ColumnIndex;
    3. string abc = DGV[column, row].Value.ToString();
    4. MessageBox.Show(abc);







    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jnpanzer“ ()

    Ich hab dir ein Beispiel angefertigt, ich glaube das ist was du vor hast. Wobei so erst die Cell mit LMB-Click markiert werden muss, dann mit RMB-Click das ContextMenu öffnen.

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. public Form1()
    4. {
    5. InitializeComponent();
    6. }
    7. private ContextMenu ct = new ContextMenu();
    8. private void Form1_Load(object sender, EventArgs e)
    9. {
    10. MenuItem item = new MenuItem();
    11. item.Text = "ping";
    12. ct.MenuItems.Add(item);
    13. item.Click += pingMenuItem_Click;
    14. for (int i = 1; i < 256; i++)
    15. {
    16. dataGridView1.Rows.Add("192.168.1." + i);
    17. }
    18. }
    19. private void pingMenuItem_Click(object sender, EventArgs e)
    20. {
    21. MessageBox.Show(dataGridView1.CurrentCell.Value.ToString());
    22. }
    23. private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    24. {
    25. if(e.Button == MouseButtons.Right)
    26. {
    27. ct.Show(this, PointToClient(Cursor.Position));
    28. }
    29. }
    30. }

    Takafusa schrieb:

    Wobei so erst die Cell mit LMB-Click markiert werden muss, dann mit RMB-Click das ContextMenu öffnen.

    Das ist eine Frage, wie man's macht. Ich habe in einem meiner Programme die gleiche Situation, löse es aber so, dass ich im CellMouseUp-EventHandler die Zelle markiere. Da danach erst der CMS erscheint, ist damit das Problem gelöst:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseUp
    2. DataGridView1.CurrentCell = DataGridView1.Item(e.ColumnIndex, e.RowIndex)
    3. DataGridView1.Item(e.ColumnIndex, e.RowIndex).Selected = True
    4. End Sub


    Allerdings weiß ich jetzt gar nicht, warum Du den CMS explizit aufrufst. Der taucht doch auch ohne jeglichen Eigencode auf - oh. Zumindest, wenn man ihn über den Designer hinzufügt und modifiziert …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.