2009-02-27 8 views
0

Ich habe Formular mit Schaltfläche und Kontrollkästchen. wenn i Knopf drücken static void wird aufgerufen, die nicht statisch Leerruf die messagebox mit dem checkbox.checked.toString zeigt() Das Problem ist, wenn ich das Kontrollkästchen Wert ändern es immer false zeigtC# Zugreifen auf Steuereigenschaften von statischen void

-Code ist

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     public void y() 
     { 
      MessageBox.Show(checkBox1.Checked.ToString()); 
     } 

     static void x() 
     { 
      Form1 f = new Form1(); 
      f.y(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      x(); 
     } 



    } 
} 

Antwort

0

Versuchen

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    public void y() 
    { 
     MessageBox.Show(checkBox1.Checked.ToString()); 
    } 

    static void x(Form f) 
    { 
     f.y(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     x(this); 
    } 

} 
1

Ich denke, Sie haben wahrscheinlich von einem Visual Basic-Hintergrund wie ich stammen.

In C# sind Formulare nur Instanzen einer Form-Klasse, sie haben keinen besonderen Status wie in den Tagen von VB6.

Wenn Sie anrufen new Form1() Sie erstellen im Grunde eine neue Form nicht die gleiche Form zugreifen. Da jedes Formular mehrere Instanzen haben kann, weil es wirklich nur eine C# -Klasse darunter ist.

Sie können dieses Problem beheben, indem sie die x mit() Methode die aktuelle Form als Parameter

static void x(Form1 theForm) 
{ 
    theForm.y(); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    x(this); 
} 

Der dieser Parameter in einem Formular der Klasse zeigt auf das Formular selbst Instanz statt.

Sie sollten jetzt den richtigen Wert anstelle des Standardwerts erhalten, wenn das Formular erstellt wird.

Ich nehme an, Sie brauchen x() zu static, nein? Aber wenn das nicht der Fall ist, könnte das Entfernen von static von x() eine bessere Lösung sein.

void x() 
{ 
    this.y(); 

    // or you can just omit the this qualifier and call just y(); 
} 
+0

Natürlich, wenn er es so macht, könnte x auch eine statische Methode sein, so dass er nicht in das Formularobjekt übergeben muss. – Powerlord

+0

Hinzugefügt, danke! – chakrit

0

Weil Sie ein neues Form1 innerhalb von x() instanziieren, versuchen Sie, 'this' als Parameter an die x-Methode zu übergeben.

+0

Natürlich, das besiegt den Punkt, es an erster Stelle statisch zu machen ... – Powerlord

+0

Nur von den Compilern pov. nicht von einer Architekturpov. –

0

Sie erstellen eine neue Form1-Instanz. warum machen Sie das? Wenn Sie ein neues Formular erstellen, wird auch ein neues Kontrollkästchen erstellt. Das Kontrollkästchen im Formular sieht standardmäßig so aus, dass es standardmäßig auf "Falsch" gesetzt ist (nicht aktiviert). Daher wird jedes Mal, wenn Sie eine neue Instanz des Formulars erstellen, diese als "Falsch" angezeigt.

1

Methode x instanziiert ein neues Formular. Das Kontrollkästchen auf dem neuen Formular ist ebenfalls neu (mit dem Formular erstellt) und hat den Standardwert false.

Was genau versuchen Sie zu tun? Warum ein neues Formular erstellen, wenn die Taste gedrückt wird? Wenn Sie dies wirklich tun möchten, müssen Sie das Kontrollkästchen des neuen Formulars nach dem Aufruf von Form f = new Form1();

0

Die checkbox1 in y() ist auf einer ganz anderen Form1 - die, die Sie in x erstellt. Setzen Sie sich einfach loswerden x() und es sollte funktionieren:

private void button1_Click(object sender, EventArgs e) 
    { 
     y(); // not x(); 
    } 
0

Ihre Probleme sind in den x() -Methode, was Sie tun, es ist eigentlich eine völlig neue Form zu machen und prüfen, ob Formulare das Kontrollkästchen, das wäre natürlich instanziieren als falsch. Anstatt dann x() aufzurufen, sollten Sie y() aufrufen.

Oder, alternativ, legen Sie die messagebox.show in der Buttonclick-Methode selbst.

0

Wenn Sie von der statischen Methode auf einige Formularinstanzen zugreifen müssen, müssen Sie irgendwo einen Verweis auf dieses Formular speichern.

Verwandte Themen