Entwickler-Ecke
WinForms - MainGUI verstecken bei Klick auf Button in UserControl [DLL]
KillTrot - Mi 04.01.17 14:56
Titel: MainGUI verstecken bei Klick auf Button in UserControl [DLL]
Guten Tag,
Ich habe mir eine MainGUI gemacht, dessen Inhalt sich jenachdem ändern soll, weshalb ich auf UserControls zurückgreife.
Damit ich das Programm ohne weiteres Updaten kann, habe ich die UserControls in einer DLL gespeichert. Nun soll bei einem Button-Klick (der Button ist in diesem UserControl) die MainGUI versteckt, bzw. minimiert werden.
Wäre froh, wenn mir da jemand helfen könnte. (Bin noch ziemlich am Anfang mit C# :roll: )
Falls mehr Informationen gebraucht werden, nur fragen;)
MfG
Th69 - Mi 04.01.17 16:24
Hallo und :welcome:
um von untergeordneten Controls (oder Forms) auf das Hauptform zuzugreifen, verwendet man am besten Ereignisse (events), s.a. meinen Artikel
Kommunikation von 2 Forms [
http://www.bitel.net/dghm1164/programming/Kommunikation_von_2_Forms.html].
In der Ereignismethode (des Hauptforms) würdest du dann diese verstecken (
Hide()) oder minimieren (
WindowState = FormWindowState.Minimized).
Falls du nicht direkt damit weiterkommst, zeige doch bitte dann den (relevanten) Code.
KillTrot - Mi 04.01.17 17:13
Danke für die Hilfe.
Ich werde deinen Artikel mal studieren und schauen, was sich damit anfangen lässt;)
Werde dann bescheid geben, wie weit ich damit gekommen bin.
Schönen Abend noch
Edit:
Ich werde daraus (leider) nun doch nicht ganz schlau...
Hier nun doch ein wenig Code, so kann man mir evtl. besser helfen:)--> Ich habe dir hier einfach das ganze Projekt hochgeladen (ist aber nur ein Beispielprojekt, anhand dessen man zeigen können sollte, wie es funktioniert):
https://drive.google.com/uc?export=download&id=0B7_xTvVzVZlvakFWcG9pZkdXYms
Danke dir
Ralf Jansen - Mi 04.01.17 17:43
Man kann hier Attachments anhängen. Das wäre uns sicher lieber als auf irgendeine 3rd Party Seite verwiesen zu werden.
Dann bitte ohne Kompilate sondern nur den Code (heißt im Prinzip die obj und bin Ordner weglassen).
KillTrot - Mi 04.01.17 18:34
Ok, danke für den Hinweis. Hier noch als Anhang und ohne die Kompilate (wenn ich alles richtig gemacht habe)
Ralf Jansen - Mi 04.01.17 18:57
In deinem UserControl erzeugst du einen Event und feuerst diesen Event aus dem Click Event des Buttons.
Etwa
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| private void button_HideMain_Click(object sender, EventArgs e) { OnHideRequested(); }
public event EventHandler<EventArgs> HideRequested;
protected void OnHideRequested() { var evt = HideRequested; if (evt != null) evt(this, EventArgs.Empty); } |
Und diesen Event fängst du dann auf der Form und machst das passende.
Also auf der Form das UserControl markieren in der EventListe des Controls dann den HideRequested Event raussuchen denn anklicken damit die Methode generiert wird und
Hide() oder was auch immer passieren soll reinschreiben.
C#-Quelltext
1: 2: 3: 4: 5:
| private void benutzersteuerelement1_HideRequested(object sender, EventArgs e) { Hide(); } |
KillTrot - Do 05.01.17 01:27
Danke dir, das funktioniert soweit. Ich hoffe, dass ich das schaffe, dies auf mein Programm anzuwenden.
Mit freundlichen Grüssen
KillTrot
KillTrot - Do 05.01.17 18:55
Sorry, dass ich das Thema noch ein mal öffne, aber ich habe noch eine Frage dazu:
Kann ich diesem Event auch zum Beispiel eine Int mitgeben, um mit einem Event verschiedene Aktionen durchzuführen, jenachdem, welche Int mitgegeben wurde?
MfG
Ralf Jansen - Do 05.01.17 19:06
Ja. Aber wenn du eine Indikator für ein Kommando mitgeben willst dann nimm ein enum und nicht einfach einen int. Oder wenn das eine überschaubare Menge von unterscheidbaren Kommandos ist nimm jeweils einen anderen Event. Ein Button hat ja für Click und Button Pressed auch verschiedene Events und nicht für alles nur ein Event und man muß dann die EventArgs auswerten um zu unterscheiden was wirklich passiert ist.
KillTrot - Do 05.01.17 19:09
Würde es dir etwas ausmachen, das mit den Enums am oberen Beispiel schnell zu machen? Bin da ein totaler Anfänger.
Schönen Abend:)
Ralf Jansen - Do 05.01.17 19:22
Wie zuvor jetzt mit eigener EventArgs Klasse
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| private void button_HideMain_Click(object sender, EventArgs e) { OnHideRequested(new HideRequestedEventArgs() { HideCommand = HideCommand.Hide }); }
public event EventHandler<HideRequestedEventArgs> HideRequested;
protected void OnHideRequested(HideRequestedEventArgs args) { var evt = HideRequested; if (evt != null) evt(this, args); }
public enum HideCommand { None, Hide, Close };
public class HideRequestedEventArgs : EventArgs { public HideCommand HideCommand { get; set; } } |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void benutzersteuerelement1_HideRequested(object sender, HideRequestedEventArgs e) { switch (e.HideCommand) { case HideCommand.Hide: Hide(); break; case HideCommand.Close: Close(); break; } } |
Th69 - Do 05.01.17 19:24
Das steht aber auch so in meinem Artikel. ;-)
KillTrot - Do 05.01.17 19:26
Danke dir!
Das wars wieder fürs Erste.
Schönen Abend:)
KillTrot - Fr 06.01.17 13:30
@Th69 Stimmt, leider finde ich mich da irgendwie nicht so zurecht, wie ich es mir wünsche:)
Hätte doch noch eine Frage zu den Events mit Argumenten:
Ich kann ja mit der Art, die @Ralf Jansen mir gegeben hat, einen "Parameter" mitgeben, in dem Fall dient dieser dafür, was gemacht werden soll. So könnte ich ja dann zum Beispiel einmal mitgeben, dass er die MainGUI verstecken soll, und ein anderes Mal gebe ich mit, dass er diese "resizen" soll.
Wie kann ich nun beim "resize" zusätzlich noch Parameter mitgeben, wie er resizen soll? (Sprich die x und y Werte)?
Danke schonmal
Th69 - Fr 06.01.17 13:51
Na, indem du passende Eigenschaften in deiner EventArgs-Klasse implementierst.
KillTrot - Fr 06.01.17 13:55
Muss mühsam sein mir zu helfen:/
Dies ist ja die EventArgs Klasse:
C#-Quelltext
1: 2: 3: 4:
| public class HideRequestedEventArgs : EventArgs { public HideCommand HideCommand { get; set; } } |
Wie würde ich dies nun genau machen, um weitere Parameter mitzugeben?
Sorry, für meine "Unfähigkeit".
Danke für die Hilfe
Ralf Jansen - Fr 06.01.17 14:27
Genauso wie für die Property HideCommand. Du mußt dir halt nur einen anderen Namen ausdenken und den passenden Typen. Habe ich dich damit verwirrt das ich die Property genauso benannt habe wie den Typen der von der Property benutzt wird?
KillTrot - Fr 06.01.17 15:23
Dementsprechend so?:
C#-Quelltext
1: 2: 3: 4: 5:
| public class HideRequestedEventArgs : EventArgs { public HideCommand HideCommand { get; set; } public HideCommand ResizeSize {get; set; } } |
Th69 - Fr 06.01.17 15:32
Nur den Datentyp mußt du natürlich entsprechend setzen:
C#-Quelltext
1:
| public Size ResizeSize { get; set; } |
oder einzeln als
C#-Quelltext
1: 2:
| public int Width { get; set; } public int Height { get; set; } |
Das sind aber Grundlagen, die du beherrschen solltest, bevor du mit WinForms arbeitest.
Wenn Hide und Resize aber zwei verschiedene Aktionen sind, dann solltest du auch zwei verschiedene Events (inklusive EventArgs) verwenden.
KillTrot - Fr 06.01.17 16:17
Dann nutze ich verschiedene Events.
Wenn ich noch eine (fürs erste) letzte Frage stellen darf:
Wenn ich diese Parameter (int Width und Hight) gesetzt habe, wie gebe ich die dem Event mit, wenn der Button geklickt wird?
Wie empfiehlst du mir das Lernen dieser Grundlagen ohne WinForms, bzw. wie empfiehlst du das lernen allgemein?
Ich bin eher der Typ, der "learning by doing" macht und notfalls googlet oder um Hilfe fragt.
MfG
Ralf Jansen - Fr 06.01.17 16:27
Zitat: |
Ich bin eher der Typ, der "learning by doing" macht und notfalls googlet oder um Hilfe fragt. |
Das ist auch nicht falsch und viele hier denken sicher ähnlich, mir eingeschlossen. Aber es gibt so eine allgemeine Grundlagenbasis die man sich erarbeiten haben sollte bevor man das nächste angeht.
Beispiel: Du kannst dir sicherlich autodidaktisch beibringen wie man mit Differentialgleichungen in der Mathematik umgeht. Wenn man sich in diesem Rahmen aber noch spielerisch den Grundrechenarten nähern muß weil man di enoch nicht kennt ist das vermutlich noch nicht das Richtige und man muß erst Grundlagen schaffen.
Hier heißt das solange du nicht soweit bist die rein sprachliche Basis soweit zu verstehen das du erkennst das die EventArgs Ableitung einfach irgendeine Klasse ist mit irgendwelchen Properties die man natürlich wie immer befüllt fehlt die programmiertechnisch noch das äquivalente Wissen zu den Grundrechenarten in der Mathematik.
KillTrot - Fr 06.01.17 16:45
Da muss ich zugeben, hast du natürlich recht:)
Es ist aber nicht so, dass ich überhaupt keine Erfahrung habe, ich habe nur vorher mit anderen "Programmiersprachen" gearbeitet, welche aber überhaupt nicht so aufgebaut ist. Von dem her ist es eine ziemliche Umgewöhnung.
Alles in Allem habt ihr aber natürlich Recht, dass man, auf dein Beispiel bezogen, nicht einfach mit der Differentialrechnung anfangen sollte, wenn man die mathematischen Grundlagen nicht kennt.
Sache ist, dass ich hier gar nicht genau weiß, was die Grundlagen sind, und da ich eigentlich vorerst nur mit WinForms arbeiten möchte, habe ich vielleicht genau etwas schwierigen getroffen.
Naja, dennoch vielen Dank für eure Geduld und eure Hilfe, hat mir wirklich geholfen und ich habe es mittlerweile hingekriegt, dass es so funktioniert wie ich es möchte. Auf jeden Fall habe ich auch sehr viel gelernt!
Vielen vielen Dank.
Ein schönes Wochenende:)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!