2017-04-12 4 views
0

Ich habe dieses Kombinationsfeld in Form1 und ich muss einige der Textfelder deaktivieren, wenn der Wert des Kombinationsfelds geändert wird und es gibt eine Schaltfläche, um zu diesem Formular zu gehen, dessen Textfelder deaktiviert werden.Wie Sie mehrere Textfelder aus einem anderen Formular deaktivieren?

Wie kann ich tun, was ich will, ohne beide Formen zur gleichen Zeit zeigen ?! Hier

ist der Code:

public partial class Form1 : Form 
{ 
    internal Grading_Section grading; 
    internal TextBox te; 
    public Form1() 
    { 
     InitializeComponent(); 
     grading = new Grading_Section(); 
     grading.Show(); 
     te = TxtAddress; 
    } 
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     FindControl fc = new FindControl(); 
     Grading_Section gr = new Grading_Section(); 
     if (comboBox1.SelectedItem == "MSC") 
     { 
      ((TextBox)fc.Ctrl(fc.TheForm("Grading_Section"), "textBox1")).Enabled = false; 
      ((TextBox)fc.Ctrl(fc.TheForm("Grading_Section"), "textBox2")).Enabled = false; 
      ((TextBox)fc.Ctrl(fc.TheForm("Grading_Section"), "textBox3")).Enabled = false; 

     } 
     else if (comboBox1.SelectedItem == "CSP") 
     { 
      ((TextBox)fc.Ctrl(fc.TheForm("Grading_Section"), "textBox1")).Enabled = true; 
      ((TextBox)fc.Ctrl(fc.TheForm("Grading_Section"), "textBox2")).Enabled = true; 
      ((TextBox)fc.Ctrl(fc.TheForm("Grading_Section"), "textBox3")).Enabled = true; 
     } 

    } 
    private void BtnNext_Click(object sender, EventArgs e) 
    { 
     this.Visible = false; 
     Grading_Section g = new Grading_Section(); 
     g.Show();  
    } 

Und das ist meine Findcontrol-Klasse:

public class FindControl 
    { 
     Control c = null; 
     Control f = null; 
     public FindControl() 
     { 
     } 
     public Control TheForm(string name) 
     { 
      FormCollection fc = Application.OpenForms; 

      //--------------------------------------------------------------------------------- 
      for (int i = 0; i < fc.Count; i++) 
      { 

       c = null; 
       if (fc[i].Name == name) 
       { 
        f = fc[i]; 
        break; 
       } 
      } 
      return ((Control)f); 
     } 

     //--------------------------------------------------------------------------------- 
     public Control Ctrl(Control f, string name) 
     { 
      * for (int i = 0; i < f.Controls.Count; i++)* 
      { 
       if (f.Controls[i].Name == name) 
       { 
        c = f.Controls[i]; 
        break; 
       } 
       if (c == null) 
       { 
        if (f.Controls[i].Controls.Count > 0) 
         Ctrl(f.Controls[i], name); 
       } 
       if (c != null) 
        break; 
      } 
      return (c); 
     } 
    } 

Bisher habe ich diesen Code zu finden, aber der einzige Weg, dass es funktioniert, ist sowohl der Formen zu zeigen, sonst zugleich zeigt es diesen Fehler:

, wenn ich diese Zeile löschen der Fehler Pop-up: "grading.Show();

"Exception Nullreference wurde nicht behandelt, eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' aufgetreten in WindowsFormsApplication2.exe"

Die Fehler aus dieser Linie aufgelaufenen:

  • for (int i = 0; i < f.Controls.Count; i ++) *
+0

Ja, Ihr Code funktioniert nur, wenn beide Formulare sichtbar sind, weil Sie die offene Formularsammlung durchgehen. Wenn Sie es auf dem zweiten Formular deaktivieren möchten, sollten Sie einen Parameter an den Konstruktor des anderen Formulars übergeben oder so etwas ... – Nino

Antwort

1
private void BtnNext_Click(object sender, EventArgs e) 
{ 
    this.Visible = false; 
    Grading_Section g = new Grading_Section(); 
    g.DisableTextBoxes(comboboxValue); 
    g.Show();  
} 

In Form Garding_Section, sollten Sie eine Methode wie folgt erstellen:

public void DisableTextBoxes(string value) 
{ 
if(value == "a") 
    { 
    //disabele related texboxes 
    } 
    else if(value == "b") 
    { 
    //disable related textboxes. 
    } 
} 

Ich hoffe, das hilft.

Verwandte Themen