C# zweite Form als Entwurf bearbeiten

xparet0209

Ensign
Registriert
Okt. 2007
Beiträge
180
hi
ich hab ein problem mit microsoft visual studios c# 2008
die 1. form zu bearbeiten ist nicht das problem - es wird ja beim erstellen des projekts angezeigt

wenn ich nun in der 1. form auf die obbere menuleiste klicke (mehrspieler) soll er abfragen
wie viele spieler es sein sollen
ein neues fenster konnte ich mit messagebox.show() anzeigen allerdings konnte ich so kein textfeld einbinden...
da hat mir ein freund gesagt ich soll eine neue form erzeugen und sie aufrufen
das habe ich folgender maßen gemacht:


PHP:
public partial class Form1 : Form
{
        public Form1(){...}

       ..... weitere methoden


        private void multiplayerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.InitializeComponent();
            f2.ShowDialog();
        }

         ....

        public partial class Form2 : Form
        {
            private System.Windows.Forms.Label label1;
            private System.Windows.Forms.TextBox textbox1;
            private System.Windows.Forms.Button button1;

            public void InitializeComponent()
            {
                this.ClientSize = new System.Drawing.Size(250, 100);

                this.label1 = new System.Windows.Forms.Label();
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(10, 10);
                this.label1.Name = "label";
                this.label1.Size = new System.Drawing.Size(50, 100);
                this.label1.Text = "Geben Sie die Anzahl der Spieler ein. ";
                this.Controls.Add(this.label1);

                this.textbox1 = new System.Windows.Forms.TextBox();
                this.textbox1.Location = new System.Drawing.Point(10, 30);
                this.textbox1.Name = "textbox1";
                this.Controls.Add(this.textbox1);
                this.textbox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textbox1_KeyPress);   
            
                this.button1 = new System.Windows.Forms.Button();
                this.button1.Location = new System.Drawing.Point(10, 60);
                this.button1.Name = "button1";
                this.button1.Text = "OK";
                this.Controls.Add(this.button1);
                this.button1.Click += new System.EventHandler(this.OK_Click);
            }
            private void OK_Click(object sender, EventArgs e)
            {
                anzSpieler = Convert.ToInt32(this.textbox1.Text);                
                Close();
            }
            private void textbox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (e.KeyChar == (char)Keys.Return)
                {
                    anzSpieler=Convert.ToInt32(this.textbox1.Text);
                    Close();
                }
            }
        }
}


das problem ist nun das ich die position von button, label und textbox nur über die koordinaten verändern kann.
gibt es da nicht ein trick um dies auch wie die erste form im entwurf zu ändern
also mit dem verschieben der felder mit der maus usw...


mfg xparet0209
 
Der Designer wird es so vermutlich nicht lesen können, füg' doch das zweite einfach ganz normal per "Neues Element hinzufügen" -> "Windows Form hinzufügen" hinzu.
 
Warum ne Klasse in einer Klasse? oO

Es gibt bessere Wege, Informationsaustausch zwischen verschiedenen Objekten durchzuführen....

Edit: Und versuche redundanten Code zu vermeiden (z.B. "anzSpieler = Convert.ToInt32(this.textbox1.Text)")
 
Mach nen Konstruktor mit InitializeComponent() rein...

edit 1:
bzw.... wenn ich länger drüber nachdenk...

erstell ne neue Form in ner eigenen Datei, weil soweit ich weiß der Visual Studio Designer nur mit der "obersten" Form in der Datei arbeitet / arbeiten kann

edit 2:
partial class is in dem Kontext wenn du keine Extra Datei für Controls hast sowieso unangebracht weil es nur sagt das die Klasse verteilt ist.
 
Zuletzt bearbeitet:
hör drauf was die anderen sagen ...
per rechtsklick ne neue form erstlelen und die kannste dann mit dem designer bearbeiten
später im programmcode der ersten form einfach die neue klasse instanzieren und dann tadaa haste deine form :)
 
ah danke^^
so jetzt kann ich es per maus bearbeiten :)

aber durch das erstellen einer neuen klasse ist die variable anzSpieler nicht mehr verfügbar...
ich könnte dafür eine methode schreiben sodass der wert in form2 an form1 übergben wird
aber wie ruf ich überhaupt form2 auf?
 
Form2 frm2 = new Form2();
frm2.Show(); oder frm2.ShowDialog();

edit: sofern diese Form2 in nem anderen Namepspace ist einfach per using den Namespace hinzufügen

die Variable entweder als Public deklarieren oder schöner per Event zurückgeben
(bei deklaration als Public wird dir vermutlich ne Warnung mit Marshall-by-Ref object ausgegeben)
 
nja ich fange mom erst mit c# an und habs daher noch nciht so mit events
ich habe jetzt einfach eine mothode getAnzspieler erstellt die den wert zurück liefert xD
aber danke für die ganzen tipps

nun habe ich ein problem was bei meinem alten code noch nicht aufgetreten ist:

anzSpieler = Convert.ToInt32(this.textbox1.Text);

bei der Zeile kommt dann der fehler: FormatException wurde nciht behandelt.
Die eingabezeichenfolge hat das falsche Format.
dabei habe ich es doch extra in int konvertieren lassen...
 
meinst du so?

PHP:
int anzSpieler = Int32.Parse(this.textbox1.Text);

also wenn ja dann funktioniert das nicht
ich bekomme immer noch den selbern fehler
 
Code:
  int anzSpieler = -1; 
            if(!string.IsNullOrEmpty(this.textbox1.Text))
                anzSpieler = Int32.Parse(this.textbox1.Text);

probier das mal, und ist der Wert wirklich ein integer ? (0 oder 1, 2.. )

und verwende ruhig tryparse zum konvertieren
 
also ich hab das mal ein gefügt und nun bleibt anzSpieler bei -1....
dass heißt textbox1.Text ist leer also ""
und nja nun hab ich das ganze mal debuggt und hab jetzt was seltsames bemerkt
wenn ich in die textbox eine zahl eingebe ruft das programm diese methode auf und überprüft es auf return - dies ist nicht der fall und es geht weiter
allerdings bleibt textbox1.Text leer
wenn ich nun eine 2. zahl eingebe (im ausgeführten programm sieht man beide zahlen)
tut er das selbe doch textbox1.Text bleibt dennoch leer..

am anfang hat das aber funktioniert...
kann mir einer bitte erklären warum das so seltsam ist?


edit:
nja ich habs jetzt so gelöst:
Code:
        private void textbox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            textbox1.Text+=Convert.ToString(e.KeyChar);

            if (e.KeyChar == (char)Keys.Return)
            {
                this.anzSpieler = Convert.ToInt32(textbox1.Text);
                Close();
            }
        }

ich habs zwar immer noch nciht verstanden warum textbox1.Text scih erst nach der methoder verändert aber egal...
aufjedenfall funktioniert es jetzt
 
Zuletzt bearbeitet:
Der Weg den du gehst ist schlecht.
Mach den "Ok"-Button zum "AcceptButton" im Formular-Designer (oder so ähnlich), so dass er nen fetteren Rahmen hat. Dann brauchst du für die TextBox keinen Key-Event-Handler.
Vor allem fügst du ja auch jedes Zeichen, d.h. auch Returns an.. willst du aber gar nicht...

Zudem hast du dann, so wie es sein sollte, auch nur einmal den Code "this.anzSpieler = Convert.ToInt32(textbox1.Text);"

Und man kann alles so hin programmieren, dass es irgendwie läuft, aber man sollte sich schon Gedanken machen, warum man etwas so oder so macht...
 
iwie finde ich den accep button nicht
kann man denn damit eine benutzer eingabe übernehmen?
 
Zurück
Oben