2017-01-18 1 views
1

Okay, das ist eine einfache Frage, aber es hat mir schon eine Weile im Kopf gestanden.C# mit checkbox von form2 in form1

Ich habe zwei Formen: Form1 und Form2.

Ich habe einige Kontrollkästchen auf Form2, und ich möchte Daten verwenden, aus kontrolliert Kontrollkästchen auf Form2 auf Form1 aber wenn ich den folgenden Code auf Form1 hinzuzufügen ist es mir eine Fehlermeldung:

if (cbTESTING.Checked) 
{ 
    uri_testings += string.Format("{0}.TESTINGS,", word); 
} 

Ich erhalte ein Fehler mit cbTESTING, da es nicht auf Form1 verwiesen wird.

Wie kann ich Kontrollkästchen von Form2 in Form1 verwenden oder referenzieren?

+0

Wie hängen die Formulare zusammen? Hat 'Form1' eine' form2' Variable vom Typ 'Form2'? – David

+0

von jetzt an beziehen sie sich überhaupt nicht, aber ich möchte die Funktionen aus den Kontrollkästchen in form2 in form1 verwenden. – Dzje

+0

Sie könnten einfach öffentliche Methoden zum Formular hinzufügen, um die Variablenwerte zurückzugeben, nein? –

Antwort

0

Ich habe es geschafft, indem ich die Checkboxen Werte in den Standardeinstellungen der Eigenschaften speichern ließ und sie dann so anrief wie jedes Mal, wenn ich das Programm öffnen wollte anstatt sie erneut anzuklicken, es speichert automatisch meine aktuellen Werte.

Vielen Dank für Ihre Hilfe.

Hier ist ein Code für zukünftige Referenz, wenn jemand anderes es so machen wollte, wie ich es tat.

Hier ist der Code, der es in den Einstellungen speichert.

  if (cbTESTING.Checked) 
      Properties.Settings.Default.cbTESTING = true; 
     else 
      Properties.Settings.Default.cbTESTing = false; 

und hier war der Code, um das in einer anderen Form zu nennen.

   if (Properties.Settings.Default.cbTESTING == true) 
      { 
       uri_domains += string.Format("{0}.testing,", word); 
      } 

Hoffe, dass dies jemand in der Zukunft helfen wird!

0

Vielleicht nicht die eleganteste Lösung, aber wird definitiv funktionieren. Deklarieren Sie eine öffentliche statische Bool-Variable in Form2. Fügen Sie Checkbox changed event zu Ihren Checkboxen hinzu und ändern Sie diese statischen Variablen entsprechend. Dann nur jene Variable in Form1 überprüfen wie Form2.VariableName lassen Sie mich wissen, wenn Sie weitere Erklärung benötigen

bearbeiten

In Form2 erklären public static bool CheckBoxStatus = false; standardmäßig falsch, Sie kann das ändern.

Fügen Sie auch in Form2 folgende Ereignis checkBox1.CheckedChanged += new EventHandler(CheckedChanged) und entsprechende Funktion hinzuzufügen, wie

private void CheckedChanged(object sender, EventArgs e) 
{ 
    CheckBoxStatus = checkBox1.Checked; 
} 

und schließlich in Form1 ein, können Sie einfach überprüfen, ob das Kontrollkästchen wie diese

if(Form2.CheckBoxStatus == true) ; 
else ; 

Hoffnung geprüft wird, das hilft . * PS entschuldigung meine Formatierung, neu zu buchen Antworten hier.

+0

Hey, würde mich sehr freuen, wenn Sie eine Beispielerklärung dazu geben könnten. – Dzje

+0

Bearbeitete meine Antwort für Sie –

0

Hier haben Sie eine hässliche Art und Weise zu tun, was Sie wollen:

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

    private void button1_Click(object sender, EventArgs e) 
    { 
     var frm = new Form2(); 
     frm.ShowDialog(); 

     label1.Text = frm.TextBoxChecked; 
    } 
} 

//Just declare a prop into Form2 a set it with the value you need 
public partial class Form2 : Form 
{ 
    public string TextBoxChecked { get; set; } 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void checkBox1_CheckedChanged(object sender, EventArgs e) 
    { 
     if (checkBox1.Checked) 
      TextBoxChecked = "Checkbox_1_checked"; 
     else 
      TextBoxChecked = "Checkbox_1_unchecked"; 
    } 
} 

Läßt in einer kühlen Art und Weise Dinge tun. Vielleicht ist ein gutes Beispiel zu Form2 zu sagen: "Hey du, wenn deine Checkbox ändert, lass es mich wissen", es klingt wie ein Rückruf. Also lassen Sie es tun:

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

    private void doWhenCheckBoxChange(string text) 
    { 
     //I'm receiving the notification indicating that the checkbox has changed 
     label1.Text = text; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var frm = new Form2(); 
     //I'm passing a callback to Form2, Here is where I say 
     //"Hey you, let me know where your checkbox change" 
     frm.DoWhenCheckboxChange = doWhenCheckBoxChange; 
     frm.ShowDialog(); 

     //label1.Text = frm.TextBoxChecked; 
    } 
} 

public partial class Form2 : Form 
{ 
    //public string TextBoxChecked { get; set; } 
    public Action<string> DoWhenCheckboxChange; 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void checkBox1_CheckedChanged(object sender, EventArgs e) 
    { 
     //TextBoxChecked = "Checkbox_1"; 
     //Notify to Form1 that checkbox has changed. 
     if (checkBox1.Checked) 
      DoWhenCheckboxChange("Checkbox_1_checked"); 
     else 
      DoWhenCheckboxChange("Checkbox_1_unchecked"); 
    } 
} 

Wenn Sie die zweite aproache testen, werden Sie feststellen, dass Sie nicht brauchen Ihre Form2 zu schließen um die Änderungen zu sehen.

1

Hier ist eine ziemlich saubere Möglichkeit, dies zu beheben .. Ändern Sie einfach den Zugriffsmodifikator public für cbTESTING im Designer für Form2.

Das ist in Form2.Designer.cs, ändern

private System.Windows.Forms.Checkbox cbTESTING; 

zu

public System.Windows.Forms.Checkbox cbTESTING; 

Dann Form1 wie folgt aussehen:

public partial class Form1 : Form 
{ 
    public Form1() { 
     InitalizeComponent(); 

     Form2 secondForm = new Form2(); 
     bool isChecked = secondForm.cbTESTING.checked; 
    } 
} 

Edits:protected Lösung entfernt, die nicht eine gute Option ist Fall.

+0

'protected' funktioniert für geerbte Klassen,' Form1' sollte 'Form2' erben, sonst nicht, weil' Form1' 'Form2' verwendet. – Everyone

+0

Ich war durch die Verwendung von "geschützt" verwirrt, die mich falsch führen. 'protected' würde sowieso nicht funktionieren. In Ihrer Lösung, die 'public' verwendet, sieht es jedoch wie meine Lösung aus, aber jetzt 'Form1: Form' und 'Form2: Form', weil es auf die öffentliche Variable seiner Instanz zugreift. – Everyone

+0

@AmmarSalman Ich habe gerade etwas Zeit damit verbracht, in Visual Studio herumzuspielen, und es stellte sich heraus, dass ich dringend eine Lektion über Zugriffsmodifizierer benötigte, bevor ich versuchte, ihnen zu zeigen, wie man sie anderen Leuten nutzt. Ich habe den "geschützten" Teil vollständig von meiner Antwort entfernt, da ich zustimme, dass dies nicht die beste Option für diesen Fall ist. – arbitrarystringofletters

2

Ich würde so etwas tun:

Seit Form1Form2 schafft, und Form1 Bedürfnisse zu manipulieren Form2 dann können Sie dies von Form2.Designer.cs ändern:

private System.Windows.Forms.Checkbox cbTESTING; 

An:

public System.Windows.Forms.Checkbox cbTESTING; 

Angenommen in Form1 Sie erstellt Form2 wie folgt:

Form2 f2 = Form2(); 
f2.Show(); 

Dann nutzen Sie diese cbTESTING überprüfen:

if(f2.cbTESTING.Checked) // do stuff ; 

EDIT: Ich habe Ihren Kommentar zu sehen, die sagt, dass sie überhaupt miteinander in Beziehung stehen nicht was es unmöglich macht zu in irgendeiner einfachen Methode erreichen. Was Sie gesagt haben impliziert Kommunikation zwischen diesen beiden THREADS seit jeder Form läuft in einem Thread und diese Threads sind nicht verwandt. Kommunikation ist keine einfache Sache zu tun, können Sie es mit UDP und Events versuchen, aber vertrauen Sie mir, eine direkte Beziehung zwischen ihnen würde die Dinge viel einfacher für Sie machen.

Wie auch immer, ich würde davon ausgehen, andere Form oder Thread würde diese Forms starten?

+0

Ich habe Ihren Kommentar gesehen und habe diese genauen Änderungen vor ein paar Minuten vorgenommen. Ich habe einen Fehler gemacht, der zwischen geschützt und öffentlich unterscheidet, aber ich habe das in meiner Antwort behoben. Danke für den Fehler! – arbitrarystringofletters

+0

Okay, ich bin mir nicht sicher, ob die erste Methode funktioniert, ich werde sie trotzdem entfernen. Danke für die Antwort – Everyone

+0

Rest Tippfehler; Ich hatte sie von meinem ursprünglichen Post umgedreht. Bitte stellen Sie sicher, dass es jetzt korrekt ist. – arbitrarystringofletters

Verwandte Themen