Entwickler-Ecke
C# - Die Sprache - Problem mit öffnen einer Form!?!?!?
#5h0rty# - Di 22.01.08 16:36
Titel: Problem mit öffnen einer Form!?!?!?
Hallo alle zusammen.
ich öffne eine Form mit einem Button.
C#-Quelltext
1: 2: 3: 4:
| private void key1_Click(object sender, EventArgs e) { new Form2().Show(); } |
nur wenn ich ein zweites mal auf den Butten Klicke öffnet sich die Form noch einmal.
So das ich 2x die selbe Form offen habe.
Frage: Wie kann ich das vermeiden?
danke schon mal im vorraus.
MFG
Christian S. - Di 22.01.08 16:57
Hallo!
Du hast die Klasse Form2, von der erzeugst Du bei jedem Buttonklick mittels new eine neue Instanz. Daddurch wird jedes Mal eine neue Form angezeigt.
Du musst die Instanz einmal erzeugen und dann in einem Feld speichern. Dann kannst Du immer wieder auf dieselbe Instanz zugreifen.
Grüße
Christian
#5h0rty# - Di 22.01.08 18:27
hallo und danke erst mal für die schnelle Antwort.
Sorry wenn ich das nicht ganz verstehe, bin Anfänger.
Was heist:
"und dann in einem Feld speichern"
wie macht man so was?
Mitmischer 1703 - Di 22.01.08 18:34
Titel: Re: Problem mit öffnen einer Form!?!?!?
C#-Quelltext
1: 2: 3: 4: 5: 6:
| private void key1_Click(object sender, EventArgs e) var Form2 *TForm { Form2 = new TForm (Form1->Handle) Form2->Show(); } |
Glaub' ich zumindest :), hab mit C in der letzten Zeit nichts gemacht! :zwinker:
Christian S. - Di 22.01.08 18:37
@Mitmischer: C# != C(++/CLI) ;-) Außerdem wird dann immer noch ständig eine neue Instanz erstellt.
Ich meine das so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public class Form1 : Form {
private Form2 form2;
private void key1_Click(object sender, EventArgs e) { if (form2 == null) form2 = new Form2();
form2.Show(); } } |
Bitte mal das
OpenBook [
http://www.galileocomputing.de/openbook/visual_csharp/] konsultieren.
Mitmischer 1703 - Di 22.01.08 18:40
@Christian: != versteht mein Compiler! :D
#5h0rty# - Di 22.01.08 19:03
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public class Form1 : Form {
private Form2 form2;
private void key1_Click(object sender, EventArgs e) { if (form2 == null) form2 = new Form2(); form2.Show(); } } |
also bei dem 1. und 2. sagt der Comp. mir das es ein "Type" ist, wird aber wie eine "Variable" verwendet.
beim 2. sagt er mir das: form2 enthält keine Definition für "show".
wie muß ich das verstehen?
LG
Christian S. - Di 22.01.08 19:13
Hast Du auf Groß- und Kleinschreibung geachtet?
#5h0rty# - Di 22.01.08 19:24
ja!
ich konte ja auch alles auswählen. also es ist ja auch alles blau und hell blau! nur beim Compelieren meckert er mir das an.
LG
Christian S. - Di 22.01.08 19:28
Folgender Quelltext funktioniert bei mir:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| private Form2 form2;
private void button1_Click(object sender, EventArgs e) { if (form2 == null) form2 = new Form2();
form2.Show(); } |
Der Fehler muss bei Dir also woanders liegen. :nixweiss: Poste doch einfach mal ein größeres Stück Quelltext.
#5h0rty# - Di 22.01.08 20:06
C#-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: 27: 28: 29: 30:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;
namespace HMI { public partial class FCentral : Form { public FCentral() { InitializeComponent(); }
private void Browserr_DoubleClick(object sender, EventArgs e) { if (Browserr.SelectedNode.Name == "LED Alterung 5") { if (LEDAlterung == null) LEDAlterung = new LEDAlterung();
LEDAlterung.Show(); } |
Christian S. - Di 22.01.08 20:10
Wo ist das Feld? Und Du hast doch alles groß geschrieben :roll:
#5h0rty# - Di 22.01.08 20:27
Wie wo ist das Feld?
C#-Quelltext
1:
| if (Browserr.SelectedNode.Name == "LED Alterung 5") |
C#-Quelltext
1:
| if (LEDAlterung == null) |
hir ist schon das erste Problem.
FehlerMeldung: LEDAlterung ist ein "Type" wird aber wie eine "Variable" verwendet!!!
#5h0rty# - Di 22.01.08 20:31
oh mann jetzt sehe ich das erst.. :shock: ...ich bin doch blöd.... :roll:
Danke Leute so gehts, ist nur ein haufen fleißarbeit bei ca 90 "show" aufrufen.
Danke
mutterholzbein - Di 22.01.08 23:09
Titel: Re: Problem mit öffnen einer Form!?!?!?
#5h0rty# hat folgendes geschrieben: |
private void key1_Click(object sender, EventArgs e)
{
new Form2().Show();
}
[/cs] |
hoi
#5h0rty#,
ich hätte es ja so versucht (geht eigentlich immer ohne probs!)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| private void key1_Click(object sender, EventArgs e) { Form f2=new Form2(); f2.Show(); } |
denn einfach nur:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| private Form2 f2;
private void button1_Click(object sender, EventArgs e) { if (f2 == null) f2 = new Form2(); f2.Show(); } |
wirft nach dem schliessen und erneutem öffnen der form exceptions...
(System.ObjectDisposedException)
greetz mhb :wave:
Christian S. - Di 22.01.08 23:12
Er wollte ja aber gerade nicht bei jedem Button-Klick ein neues Fenster :zwinker:
mutterholzbein - Di 22.01.08 23:45
Titel: rööh:
Christian S. hat folgendes geschrieben: |
Er wollte ja aber gerade nicht bei jedem Button-Klick ein neues Fenster :zwinker: |
^^hmh, na dann zb so:
als erstes verweis zur Microsoft.VisualBasic-Library ins projekt einbinden.
dann die Program.cs öffnen:
C#-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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| ... using Microsoft.VisualBasic.ApplicationServices; ... static class Program { [STAThread] static void Main(string[] commandLine) { Application.SetCompatibleTextRenderingDefault(false); CApplication myApp = new CApplication(); myApp.Run(commandLine); } }
class CApplication : WindowsFormsApplicationBase { public CApplication() { this.IsSingleInstance = true; this.EnableVisualStyles = true; this.ShutdownStyle = ShutdownMode.AfterMainFormCloses; }
protected override void OnCreateMainForm() { this.MainForm = new Form1(); }
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) { base.OnStartupNextInstance(eventArgs); MessageBox.Show("Läuft schon!", "Achtung! "+Application.ProductName); } } ... |
greetz mhb :wave:
Christian S. - Di 22.01.08 23:58
Und es geht auch nicht darum, nur eine Instanz des Programmes zu starten, sondern ein Fenster innerhalb des Programmes nicht immer neu zu erstellen ... Das Problem ist ja nun auch schon gelöst :roll:
(Das mit der einen Instanz würde ich über einen Mutex machen)
#5h0rty# - Mi 23.01.08 08:45
hi Leute...
Christian S. hat recht.
So wie er es beschrieben hat geht es auf jedenfall und relativ unkompliziert.
Nur für mich währe es noch einfacher wenn ich direkt abfragen kann ob die Form bzw. die Instanz schon geladen ist.
zb.:
C#-Quelltext
1: 2:
| if (NewForm = false) new NewForm().Show(); |
Weil ich habe einen treeview mit ca 90 Formen die ich von da öffnen kann.
alles andere wäre ein haufen arbeit.
LG
JüTho - Mi 23.01.08 10:31
#5h0rty# hat folgendes geschrieben: |
Nur für mich währe es noch einfacher wenn ich direkt abfragen kann ob die Form bzw. die Instanz schon geladen ist.
Weil ich habe einen treeview mit ca 90 Formen die ich von da öffnen kann.
alles andere wäre ein haufen arbeit. |
[OT]
Falsches Deutsch: "... weil ich einen Treeview habe..." oder "Denn ich habe..."[/OT]
Zur Sache: Dafür gibt es mehrere Möglichkeiten. Zum einen könntest Du eine allgemeine Methode machen, die die Prüfung auf null vornimmt, bei Bedarf das neue Formular erzeugt und anschließend öffnet. Probleme dabei sind, aus Type bzw. typeof() eine spezielle Instanz von Form2 zu erzeugen und zu prüfen, ob ein solches Formular überhaupt schon existiert.
Im Prinzip kannst Du auf
Application.OpenForms-Eigenschaft zugreifen und prüfen, ob ein Formular mit dem betreffenden Namen schon geöffnet ist:
C#-Quelltext
1: 2: 3: 4: 5:
| Form currentForm = Application.OpenForms["Form2"]; if (currentForm == null) { currentForm = new Form2(); } currentForm.Show(); |
Am einfachsten und sichersten dürfte ein
Dictionary<Type, Form> sein. Beim Programmstart trägst Du alle vorhandenen Typen ein:
C#-Quelltext
1: 2: 3:
| Dictionary<Type, Form> formTypes = new Dictionary<Type, Form>(); formTypes.Add(typeof(Form2), null); |
Bei Bedarf kannst Du direkt prüfen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| CheckForm(typeof(Form2)); void CheckForm(Type currentType) { Form currentForm = formTypes[currentType]; if (currentForm == null) { currentForm = xxx.CreateInstance() as currentType; formTypes[currentType] = currentForm; } currentForm.Show(); } |
In anderem Zusammenhang habe ich
CreateInstance o.ä. schon genutzt, aber nicht bei Formulare. Ich weiß deshalb nicht genau, wie es zu realisieren ist (und habe jetzt keine Zeit zur Suche).
Das sollte aber trotzdem schön weiterhelfen. Jürgen
Christian S. - Mi 23.01.08 10:33
Warf 'ne Dictionary im Gegensatz zur HashTable nicht eine Exception, wenn der Schlüssel nicht existiert? :gruebel:
#5h0rty# - Mi 23.01.08 13:24
Hi Leute...
Danke noch mals für eure eifrige mithilfe habe sehr viel gelernt. :flehan: :mahn:
Letztäntlich mache ich das jetzt so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| private void Browserr_DoubleClick(object sender, EventArgs e) { if (Browserr.SelectedNode.Name == "LEDAlterung") { Form currentForm = Application.OpenForms["LEDAlterung"]; if (currentForm == null) { currentForm = new LEDAlterung(); } currentForm.Show();
} |
Läuft.... :D :wave:
PS.: Und vielen dank auch an meinen Kollegen (Andreas B.)
JüTho - Mi 23.01.08 16:33
Christian S. hat folgendes geschrieben: |
Warf 'ne Dictionary im Gegensatz zur HashTable nicht eine Exception, wenn der Schlüssel nicht existiert? :gruebel: |
Stimmt. Deshalb sollte man vorher noch
Dictionary.ContainsKey() benutzen.
Ich wollte heute früh (unter Zeitdruck) meine wichtigsten Gedanken aufschreiben.
@5h0rty
Verstehe ich Dich richtig, dass Du jetzt doch Deinen letzten Code 90 Mal verwendest - passend für jedes Formular? Dann lohnt es sich nicht mehr, dass ich mir über CreateInstance Gedanken mache, oder?
Jürgen
#5h0rty# - Mi 23.01.08 17:03
Hi Jürgen
Ja ich habe es "nur" 76x gemacht. Ist zwar alles nicht so schön, aber es funktioniert.
trotzdem danke für deine mühe.
mfg Tommy
pi - Do 27.03.08 23:57
ich bin blutiger anfänger was c# angeht,
kann man eure lösung als funktion verwenden ?
ala:
private void button1_Click(object sender, EventArgs e){
form_checker("form2");
}
wenn ja, wo schreibt man die hin ?
danke.
JüTho - Fr 28.03.08 10:45
pi hat folgendes geschrieben: |
ich bin blutiger anfänger was c# angeht,
kann man eure lösung als funktion verwenden ? |
Dringende Empfehlung: lass es bleiben.
Befasse Dich zuerst "manuell" mit dem Aufruf von zwei oder drei Formularen, mal mit Show(), mal mit ShowDialog(), dann auch mit Close() und später neuem Aufruf.
Wenn Du verstanden hast, was dabei alles passiert, und das standardisieren willst (und nicht mehr von Funktionen statt Methoden sprichst), dann komm wieder hierher.
Nur ganz kurz: Der Zugriff auf Application.OpenForms geht immer und überall. Wenn die Formulare mit einem Dictionary registriert werden, dann benötigt man dafür eine "übergeordnete" Stelle, z.B. eine Singleton-Klasse FormContext, dafür und für die Prüfmethode. Aber ich vermute mal, alle diese Begriffe sind für Dich noch böhmische Dörfer. Also bis in ein paar Wochen...
Gruß Jürgen
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!