Autor |
Beitrag |
Felix2000
      
Beiträge: 124
|
Verfasst: Mi 10.08.11 15:07
Hi Folks !
Ich plane in C Sharp für eine einfache Benutzeroberfläche ein Kontextmenü einzubauen. Dieses soll sich an einem beliebigen Punkt auf der Oberfläche anzeigen lassen, wenn der Benutzer einen rechten Mausklick vornimmt. Das Kontextmenü soll in einer separarten Klasse erstellt und eingebunden werden. Hier mein bisheriger Code:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| class contextmenue {
public static void addContextmenue() { ContextMenu menue = new ContextMenu(); menue.Name = "Erstes Kontextmenü"; menue.MenuItems.Add("Erster Punkt"); menue.MenuItems.Add("Zweiter Punkt"); menue.MenuItems.Add("Dritter Punkt"); menue.MenuItems.Add("Vierter Punkt");
showContextMenue(menue);
}
public static void showContextMenue(ContextMenu menue) {
menue.Show();
}
} |
Hier der Code in dem Formular, wo dem das Kontextmenü dargestellt werden soll:
Quelltext 1: 2: 3: 4: 5: 6:
| private void Form1_Click(object sender, EventArgs e) { contextmenue.addContextmenue();
} |
Leider passiert aber gar nichts, was genau mache ich falsch? Benutzer ich evtl. ein falsches Event? Beim Debuggen wird die eventMethode nciht aufgerufen.
Gibt es eigentlich auch die Möglichkeit, ein solches Kontextmenü nur in ganz bestimmten Bereichen anzeigen zu lassen?
Greetz
Felix
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Mi 10.08.11 15:35
Felix2000 hat folgendes geschrieben : |
Leider passiert aber gar nichts, was genau mache ich falsch? Benutzer ich evtl. ein falsches Event? Beim Debuggen wird die eventMethode nciht aufgerufen. |
Eventuell klickst du ja nicht auf das Form sondern auf irgendein Control auf dem Form (z.B. ein Panel oder ein Button).
Warum möchtest du eigentlich das Contextmenü in einer anderen Klasse erstellen? Was spricht dagegen es in der Form zu machen? (gehört ja zur GUI)
Noch ein paar Anmerkungen:
1. Achte auf deine Klassenbenennung der Unterschied zwischen deiner "contextmenue" und der .Net-Klasse "ContextMenue" ist nicht gut sichtbar.
2. Ich wusste garnicht das ContextMenue.Show eine Überladung ohne Parameter hat. Normalerweise gibt man mindestens das ParentControl oder die Position an.
Moderiert von Th69: Quote korrigiert
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Mi 10.08.11 16:00
[quote=" bakachan"(647340)] Felix2000 hat folgendes geschrieben : |
Leider passiert aber gar nichts, was genau mache ich falsch? Benutzer ich evtl. ein falsches Event? Beim Debuggen wird die eventMethode nciht aufgerufen./quote]
Eventuell klickst du ja nicht auf das Form sondern auf irgendein Control auf dem Form (z.B. ein Panel oder ein Button).
Warum möchtest du eigentlich das Contextmenü in einer anderen Klasse erstellen? Was spricht dagegen es in der Form zu machen? (gehört ja zur GUI)
Noch ein paar Anmerkungen:
1. Achte auf deine Klassenbenennung der Unterschied zwischen deiner "contextmenue" und der .Net-Klasse "ContextMenue" ist nicht gut sichtbar.
2. Ich wusste garnicht das ContextMenue.Show eine Überladung ohne Parameter hat. Normalerweise gibt man mindestens das ParentControl oder die Position an. |
Hallo !
Ich teste gerade ein wenig in C Sharp Programmierung herum und wolte mal in individuelles Kontextmenü erstellen, welches einfach nur 4 Punkte bzw. Texte enthält. Und dieses Kontextmenü soll einfach bei einem Rechtsklick auf der Benutzeroberfläche angezeigt werden !
Vielleicht kannst du mir ja nochmal helfen? Wie genau kann ich ein solches Kontextmenü überhuapt anzeigen? Erezugt habe ich es angeblich laut Visual Studio schon!?
Greetz
Felix
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Mi 10.08.11 16:25
Gehen wir mal vom einfachsten Fall aus:
Dein Form-Objekt hat ja schon eine Property für ContextMenue, welches aber null ist.
Also musst du erst mal eins erstellen und zuweisen
C#-Quelltext 1:
| this.ContextMenue = new ContextMenue(); |
Dann kannst du die entsprechenden Items erstellen.
C#-Quelltext 1: 2:
| MenuItem newItem = new MenuItem("TestItem"); this.ContextMenu.MenuItems.Add(newItem); |
Da es das ContextMenu der Form ist wird es standardmäßig bei einem Rechtsklick auf der Form aufgerufen. Du kannst es aber auch manuell anzeigen mit der Show-Funktion, dabei musst du aber mindestens das TargetControl und die dazu relative Position als Parameter übergeben.
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 10.08.11 16:28
Hallo Felix,
dein Weg mit einem eigenen Event ist der falsche Weg. Nutze dazu einfach für jedes Control, welches dein Kontextmenü anzeigen soll, dessen Eigenschaft ContextMenu.
P.S. Neuere Programme sollten stattdessen eigentlich ContextMenuStrip nutzen!
Und noch ein P.S.: dein Code kann so eigentlich gar nicht funktionieren, da du die Variable 'menue' ja nur lokal erstellt hast...
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Do 11.08.11 10:10
Hi Folks !
Thx für eure Hilfe !
Nun hat das auch geklappt mit der Erstellung des Kontextmenüs. Wisst ihr vielleicht auch noch, wie ich gewisse Ereignisse diesem menü hinzufügen kann, wenn ich auf einen der Menüpunkte klicke? Zum einfachen Austesten reicht ja erstmal eine Messagebox oder so etwas.
Greetz
Felix
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Do 11.08.11 10:17
An den einzelnen MenuItems gibt es das entsprechende Event (Click).
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Do 11.08.11 10:24
Tut mir leid, aber ich finde das nicht...
Das ist mein bisheriger Code, wenn ein Formular aufgerufen wird:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void Form1_Load(object sender, EventArgs e) {
MessageBox.Show("Applikation startet !"); this.ContextMenu = new ContextMenu(); ContextMenu.MenuItems.Add("Erster Menüpunkt"); ContextMenu.MenuItems.Add("Zweiter Menüpunkt"); ContextMenu.MenuItems.Add("Dritter Menüpunkt"); ContextMenu.MenuItems.Add("Vierter Menüpunkt"); } |
//Edit
Welche Events sind das denn genau und wie muss ich diese hier in meinem Codebeispiel hinzufügen? Ich "vermute" als zweiten Parameter in der Add() Methode oder?
Ich wäre aber sehr dankbar, wenn mir das jemand als konkretes Codebeispiel erklären könnte.
Greetz
Felix
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 11.08.11 11:33
Hallo Felix,
ja es gibt genau diese Überladung der Add-Methode: Menu.MenuItemCollection.Add(string, EventHandler)
Und schau dir das Beispiel dazu an...
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Do 11.08.11 12:08
Hi Folks !
Super jetzt habe ich es hinbekommen ! Klasse, wenn man einmal das Konzept gesehen und verstanden hat, dann wird zukünftige Antizipation einfacher !
Kann ich diesen Kontextmenüs eigentlich auch so etwas wie optische Linien zur Trennung einzelner Menüpunkte hinzufügen, also dass es für den benutzer angenehmer erscheint !
Greetz
Felix
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 11.08.11 12:41
Ja, dazu einfach "-" als MenuItem Text übergeben 
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Do 11.08.11 13:50
Hi Folks !
Ahh, das geht in C Sharp ja einfach, als gedacht.
Kann man diesen Kontextmenüs (oder auch einem Hauptmenü bzw. den einzelnen Punkten in einem solchen Hauptmenü) Symbole bzw. kleine Grafiken zuordnen? Funktioniert so etwas in C Sharp evtl.? Oder gibt es dafür andere Klassen als die Klassen "Contextmenu" und "MainMenu"?
Greetz
Felix
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Do 11.08.11 14:03
Also bei ToolStripItems (z.B. an einem ContextMenuStrip) kann man Bilder setzen, bei den MenuItems im ContextMenu ging das glaube ich nicht.
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Do 11.08.11 14:21
Hi Folks !
thx for that answering !
Also wenn ich die Erstellung und Verwendung von Kontextmenüs richtig verstanden habe, dann kann man für jedes einzelne Objekt unterschiedlicher Klassen ohne weiteres ein eigenes Kontextmenü erstellen!?
Also das Hauptformular bekommt bspw. ein eigenes Kontextmenü verpasst, sowie die einzelnen Buttons, Labels usw.
Ich habe das jetzt mal anhand zweier Objekte auf demselben Formular ausgetestet, aber die verschiedenen Kontextmenüs werden zu einem Kontextmenü zusammengefasst.
Ich habe nun folgenden C Sharp Code geschrieben:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| private void Form1_Load(object sender, EventArgs e) { //Hinweis auf Applikationsstart MessageBox.Show("Applikation startet !");
//Erstellung Hauptmenü MainMenu mainmenue = new MainMenu(); this.Menu = mainmenue;
MenuItem datei = new MenuItem("Datei"); MenuItem bearbeiten = new MenuItem("Bearbeiten"); MenuItem extras = new MenuItem("Extras");
this.Menu.MenuItems.Add(datei); this.Menu.MenuItems.Add(bearbeiten); this.Menu.MenuItems.Add(extras);
MenuItem oeffnen = new MenuItem("Öffnen"); MenuItem schliessen = new MenuItem("Schließen");
datei.MenuItems.Add(oeffnen); datei.MenuItems.Add(schliessen);
MenuItem markieren = new MenuItem("Markieren"); MenuItem loeschen = new MenuItem("Löschen"); MenuItem kopieren = new MenuItem("Kopieren");
bearbeiten.MenuItems.Add(markieren); bearbeiten.MenuItems.Add(loeschen); bearbeiten.MenuItems.Add("-"); bearbeiten.MenuItems.Add(kopieren);
MenuItem optionen = new MenuItem("Optionen"); MenuItem hilfe = new MenuItem("Hilfe");
extras.MenuItems.Add(optionen); extras.MenuItems.Add(hilfe);
//Kontextmenü für das Hauptformular ContextMenu contextmenue = new ContextMenu(); this.ContextMenu = contextmenue;
MenuItem eins = new MenuItem("Erster Menüpunkt", new EventHandler(erstesItem_Click)); MenuItem zwei = new MenuItem("Zweiter Menüpunkt", new EventHandler(zweitesItem_Click)); MenuItem drei = new MenuItem("Dritter Menüpunkt", new EventHandler(drittesItem_Click)); MenuItem vier = new MenuItem("Vierter Menüpunkt", new EventHandler(viertesItem_Click));
ContextMenu.MenuItems.Add(eins); ContextMenu.MenuItems.Add(zwei); ContextMenu.MenuItems.Add(drei); ContextMenu.MenuItems.Add("-"); ContextMenu.MenuItems.Add(vier);
//Kontextmenü für das DGV Objekt ContextMenu dgvContextMenue = new ContextMenu(); dgv_database.ContextMenu = dgvContextMenue;
MenuItem dgv_eins = new MenuItem("Erster DGV-Menüpunkt", new EventHandler(erstesDGVItem_Click)); MenuItem dgv_zwei = new MenuItem("Zweiter DGV-Menüpunkt", new EventHandler(zweitesDGVItem_Click)); MenuItem dgv_drei = new MenuItem("Dritter DGV-Menüpunkt", new EventHandler(drittesDGVItem_Click)); MenuItem dgv_vier = new MenuItem("Vierter DGV-Menüpunkt", new EventHandler(viertesDGVItem_Click));
ContextMenu.MenuItems.Add(dgv_eins); ContextMenu.MenuItems.Add(dgv_zwei); ContextMenu.MenuItems.Add(dgv_drei); ContextMenu.MenuItems.Add("-"); ContextMenu.MenuItems.Add(dgv_vier); } |
Die jeweiligen Events stehen weiter unten in der Klasse, sind aber für dieses Beispiel ohne Bedeutung und sie funktionieren auf jeden Fall !
Könnt ihr mir vielleicht sagen, was ich hier falsch mache?
Greetz
Felix
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Do 11.08.11 14:33
Du fügst ja auch alle Items nur dem einen ContextMenu zu
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ContextMenu.MenuItems.Add(eins); ContextMenu.MenuItems.Add(zwei); ContextMenu.MenuItems.Add(drei); ContextMenu.MenuItems.Add("-"); ContextMenu.MenuItems.Add(vier); ContextMenu.MenuItems.Add(dgv_eins); ContextMenu.MenuItems.Add(dgv_zwei); ContextMenu.MenuItems.Add(dgv_drei); ContextMenu.MenuItems.Add("-"); ContextMenu.MenuItems.Add(dgv_vier); |
Also hast du am Ende alle im ContextMenu des Forms
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Do 11.08.11 14:41
Aber Contextmenu ist doch nur die Klasse und das Formular und das andere Objekt sind explizit deklariert. Ich verstehe das nicht.
//EDIT
Ich muss mich nochmal korrigieren, ich habe es nun hinbekommen die beiden Contextmenüs zu trennen. Allerdings wird nur das Kontextmenü für das Hauptformular aufgerufen.
Wenn ich jetzt z.B. mit der rechten Mautaste über einen bestimmten Objekt klicke, dann wird immernoch das Kontextmenü für das Hauptformular aufgerufen.
Muss ich da evtl. ein bestimmtes Event dafür beachten, wenn ich sicherstellen möchte, dass über einen bestimmten Objekttypen auch ein dafür spezielles Kontextmenü geöffnet werden soll?
Thx for the helping !
Greetz
Felix
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Do 11.08.11 15:24
Felix2000 hat folgendes geschrieben : | Aber Contextmenu ist doch nur die Klasse und das Formular und das andere Objekt sind explizit deklariert. Ich verstehe das nicht. |
ContextMenu ist in dem Umfeld eine Property von deiner Form-Klasse also ein Objekt und keine Klasse.
Edit:
Das mit den verschiedenen ContextMenus funktioniert schon, kannst es ja mal mit einem Button testen. Das Problem da ist eher das DataGridView aber mit ContextMenuStrip anstelle von ContextMenu sollte es gehen.
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Fr 12.08.11 14:12
Hi Folks !
Wenn ich ein Kontextmenü mittels ToolStripMenuItem aufbaue, wie kann ich diesem Kontext eigentlich zusätzlich zu dem Kontextmenütext noch ein Bild / Grafik anfüfen? Geht so etwas eigentlich überhaupt?
Diese Code habe ich bisher geschrieben, bewirken tut er aber leider nichts:
Quelltext 1:
| toolstripmenu.DisplayStyle = ToolStripItemDisplayStyle.Image; |
Greetz
Felix
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Fr 12.08.11 14:24
Du musst schon auch noch das Image setzen.
Du sagst dem item ja es soll ein Bild anzeigen du sagst aber nicht welches.
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Fr 12.08.11 14:49
Wie genau mache ich das denn??
Greetz
Felix
|
|