7.6k Aufrufe
Gefragt in Anwendungen(Java,C++...) von
Hallo zusammen! Ich habe ein kleines Problem und dazu eine Frage. Ich arbeite mit C# (bin noch Anfänger) und möchte folgendes tun:
In einer Form1 befindet sich eine Listbox1 und darin befinden sich 5 Einträge (X1, X2...,X5).
In einer Form2 befindet sich ein Label1.
Ich möchte nun erreichen, wenn ich z.B. auf den Eintrag X3 klicke, dass sich Form2 öffnet und im Label1 der Text X3 steht.
Ich habe das schon mit der Erstellung von neuen Instanzen versucht - klappt nicht. Auch der Versuch mit der Übergabe eines Parameters klappte nicht.
Kann mit bitte jemand behilflich sein und mir ein wenig auf die Sprünge helfen? Ich bin sicher das ist ganz einfach - nur ich komm nicht drauf. Danke schon mal im Voraus, Claudia.

26 Antworten

0 Punkte
Beantwortet von
Hallo computerschrat,
danke für Deine Sonntagsmühen, aber so richtig habe ich da keinen Plan.
Ich gehe mal davon aus, dass Zeitdifferenz eine Variable vom Typ int sein sollte. Das Problem besteht darin, wie komme ich aus Form2 an diese Zeitdifferenz heran? Ich seh da echt keine Lösung.
Könntest Du bitte Deinen Vorschlag mal einfach in meinen letzten gesendeten Quellcode aus Antwort 19 einbauen, vielleicht macht's dann endlich klick bei mir. Ich bin schon mal ganz glücklich, dass das mit den einzelnen Instanzen jetzt funktioniert und das in jeder auch der richtige Ort drin steht - nur die Zeit ist halt noch nicht korrekt.
Danke und gruß, Claudia.
0 Punkte
Beantwortet von computerschrat Profi (33.3k Punkte)
Hallo Claudia,

hier mein Versuch mit der Zeit:

################### Form1 #######################
namespace ZweiForms
{
public partial class Form1 : Form
{
private string[] ort = new string[] { "Midway Island", "London", "Wellington" };
private int[] diff = new int[] { -660, +0, +720 };

private Form2 _form2;
private Form2 _form3;
private Form2 _form4;
public Form1()

{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this._form2 = new Form2();
this._form3 = new Form2();
this._form4 = new Form2();

listBox1.Items.Add(ort[0]);
listBox1.Items.Add(ort[1]);
listBox1.Items.Add(ort[2]);

}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int index;
string curItem;
try
{
curItem = listBox1.SelectedItem.ToString();
index = listBox1.FindString(curItem);

}
catch
{
index = 99; // Hier gehts hin, wenn ein Fehler auftritt
curItem = "Fehler";
}

// Hier die Auswertung
switch (index)
{
case 0:
{
this._form2.Visible = true;
this._form2.label1.Text = curItem;
this._form2.Verschiebung = diff[index];
break;
}
case 1:
{
this._form3.Visible = true;
this._form3.label1.Text = curItem;
this._form3.Verschiebung = diff[index];
break;
}
case 2:
{
this._form4.Visible = true;
this._form4.label1.Text = curItem;
this._form4.Verschiebung = diff[index];
break;
}
case 99:
{
MessageBox.Show(curItem);
break;
}
default:
{
break;
}
}

}

private void listBox1_Click(object sender, EventArgs e)
{
}


}
}

##########################################


################### Form2 #######################
namespace ZweiForms
{

public partial class Form2 : Form
{
public int Verschiebung; //Hier hinein schreibt Form 1 beim SelectedIndexChange die Zeitverschiebung des gewählten Ortes.
DateTime zeit;

public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
timer1.Enabled = true; //Timer starten, damit das Label ab jetzt jede Sekunde auf die neue Zeit gesetzt wird.
}

private void timer1_Tick(object sender, EventArgs e)
{
zeit = DateTime.Now; //Aktuelle Zeit laden
zeit = zeit.AddMinutes(Verschiebung); // Die Verschiebung dazurechnen
string f = "HH:mm.ss";
label2.Text = zeit.ToString(f);
}

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
timer1.Enabled = false;
}
}
}

##########################################

Schau Dir mal die Lösung an. Ich habe im Form2 eine Variable Verschiebung deklariert. Da Form2 ja nur der Prototyp für die neu eröffneten Forms ist, steht die Variable für jede angezeigte Zeitzone gesondert zur Verfügung.

Ich habe mein Projekt jetzt mal auf meinem FTP.Server verfügbar gemacht.
gehe mal auf
ftp://reinhard-vogt.homeserver.com/
Melde Dich an als User supportnet mit dem Passwort supportnet.
Dann kannst Du das Projekt "ZweiForms" als Ganzes herunterladen.´und mal testen.

Gruß
computerschrat
0 Punkte
Beantwortet von
Hallo Computerschrat,
danke vielmals für die umfangreiche Antwort. Habe mir alles schon einal angesehen und auch schon gemerkt, wo zumindest einige meiner Fehler waren. Ist sicherlich noch die mangelnde Erfahrung und vor allem mangelnde Praxis. Ich hab das Ganze mal in mein Projekt übernommen bzw. für mein Projekt angepaßt (nicht komplett, sondern nur auch wieder mit 3 Einträgen in der Listbox) und dabei ist mir aufgefallen, wenn ich in der Listbox auf einen Eintrag klicke, erscheint ein zweites Fenster mit der Zeit und den anderen Daten, aber wenn ich diese Fenster schließe, kann ich nicht wieder erneut öffnen. Kann das sein? Ich kann also die jeweilige Zeitzone nur einmal anzeigen lassen und wenn ich es geschlossen habe, dann war's das. Gruß Claudia.
0 Punkte
Beantwortet von computerschrat Profi (33.3k Punkte)
Hallo Claudia,

die Instanz des Fensters muss nach einem Schließen neu angelegt werden. Im aktuellen Beispiel werden die drei Fenster im FormLoad von Form1 erzeugt. Wenn so ein Fenster dann mit Klick auf Schließen geschlossen wird ist die Instanz weg. Du müsstest also entweder das Schließen verhindern, indem Du in den Eigenschaften von Form1 die ControlBox auf false setzt, dann ist kein Schließen Button mehr da, oder aber Du prüfst vor dem Beschreiben einer Form, ob sie existiert. Falls nicht, wird sie erzeugt. Das direkte Prüfen auf Existenz ist leider nicht so einfach. Ich habe mal eine manuelle Prüfung gebastelt. Im Prototyp der Form wird eine Variable Vorhanden angelegt und im Form load mit 123, beim FormClose mit 0 belegt.
also in Form2, bei der Deklaration der Variable Verschiebung :
public int vorhanden;

Im Form2_Load
vorhanden = 123 ,

und im Form2_FormClosed
vorhanden=0;

Jetzt kannst Du im Form 1 dem Inhalt dieser Variablen abfragen, aber natürlich nur, wenn das Form schonmal angelegt wurde, deshalb jetzt on der Auswertungsroutine:

// Hier die Auswertung
switch (index)
{
case 0:
{
if ((_form2 != null) && (_form2.vorhanden == 123))
_form2.Activate();
else
{
_form2 = new Form2();
_form2.Show();
}
this._form2.label1.Text = curItem;
this._form2.Verschiebung = diff[index];
break;
}
case 1:
...
...


Die Abfrage von _form2 führt vor dem ersten Generieren der Instanz zu null, und später, auch wenn die Form geschlossen wurde zu not null. Deshalb danach noch die Abfrage nach dem Inhalt von vorhanden auf 123.

Ich habe die neue Version des Projekts auch wieder auf dem FTP-Server abgelegt.

Gruß
computerschrat


Gruß
computerschrat
0 Punkte
Beantwortet von
Hallo computerschrat,
besten Dank für die nette Erklärung. Habe alles in mein Projekt übernommen bzw. angepaßt und funktioniert alles so wie ich es mir vorgestellt habe. Vielen herzlichen Dank auch für Deine Geduld mit mir, aber es ist eben wirklich noch kein Meister vom Himmel gefallen.
Ich muß sagen, ich hab von Dir echt eine ganze Menge gelernt und auch vieles bemerkt, was ich bisher falsch gemacht habe - aber ich werde weiter dran bleiben und nicht aufgeben. Würde mich auch echt freuen, irgendwann mal wieder Deine Hilfe in Anspruch nehmen zu können.
Eine abschließende Frage vielleicht noch: würde es Sinn machen, alles was jetzt z.B. unter case x: steht in eine separate Methode zu schreiben und diese dann nur aufzurufen oder ist das zu umständlich?
Gruß Claudia.
0 Punkte
Beantwortet von computerschrat Profi (33.3k Punkte)
Hallo Claudia,

freut mich, dass ich etwas helfen konnte. Das ist meine eigentliche Motivation, hier im Supportnet mitzulesen und gelegentlich etwas zu schreiben. Danke für die nette Rückmeldung.

Ob Du den Code in den case Statements in eine eigene Methode schreibst ist mehr eine Frage des Programmierstils. Klar ist das die elegantere Methode und, wenn es richtig angelegt ist auch pflegeleichter. Eine Änderung muss dann nur an einer Stelle gemacht werden und nicht an vielen. Wahrscheinlich würde ich es tatsächlich machen, aber auf der anderen Siete, wenn es schon mal läuft, ist es auch gut :-)

Wenn es wieder mal was zu klären gibt, melde Dich einfach wieder im Supportnet. Da wird sich eine Lösung finden lassen.
Gruß
computerschrat
...