2017-03-22 3 views
0

Ich lerne C# mit WinForms und Konsolen-Apps. Ich habe ein Problem beim Zugriff auf eine andere Formularvariable. Anstatt neue Formularobjekte zu deklarieren, erkannte ich, dass ich zur Verwendung der Variablen aus einem anderen Formular dieselbe Formularinstanz verwenden musste, die die Variable enthielt. Nachdem ich meine Formulare geändert hatte, wurde in der Datei Program.cs ein Fehler angezeigt, der anscheinend nicht behoben werden konnte. Ich bin ziemlich neu in C# in Forms, also Sorry im Voraus, wenn dies ein Noob-Fehler ist. Deklarieren von Objekten der Klassen ist mir neu: XZugriff auf andere Formularvariablen

Hier ist der Code hinter den Formen, so dass Sie ein besseres Verständnis bekommen:

frmOptions:

public partial class frmOptions : Form 
    { 
     frmHelp frmHelp1; 

     public frmOptions(frmHelp frmHelp1) 
     { 
      InitializeComponent(); 
     } 

     private void tbnDisplayHelp_Click(object sender, EventArgs e) 
     { 
      //frmHelp frmHelp = new frmHelp();  //Declare a new object for the Help form so it can be accessed 
      frmHelp1.bAccessedFromForm = true; 
      this.Close(); 
      frmHelp1.Show(); 
     } 

frmHelp:

public partial class frmHelp : Form 
{ 
    frmOptions frmOptions1; 
    frmLoginCreate frmLoginCreate1; 

    public bool bAccessedFromForm = false; 

    public frmHelp(frmOptions frmOptions1, frmLoginCreate frmLoginCreate) 
    { 
     InitializeComponent(); 
    } 

    private void btnOK_Click(object sender, EventArgs e) 
    { 
     //frmLoginCreate frmLoginCreate1 = new frmLoginCreate(); 
     this.Hide(); 
     frmLoginCreate1.Show(); 
    } 

    private void frmHelp_Load(object sender, EventArgs e) 
    { 
     if (bAccessedFromForm == true) 
     { 
      btnOK.Hide(); 
      btnReturnToForm.Show(); 
     } 
    } 

    private void btnReturnToForm_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     frmOptions1.Show(); 
     btnOK.Show(); 
    } 
} 

Dies ist meine Datei Program.cs:

static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new frmHelp()); 
     } 
    } 

Dies ist der Fehler, den ich in meinem Program.cs bekommen file:

Es gibt kein Argument gegeben, die auf die erforderlichen formalen Parameter 'frmOptions1' von

entspricht 'frmHelp.frmHelp (frmOptions, frmLoginCreate)'
+1

Der einzige 'Konstruktor' innerhalb der 'frmHelp' -Form, der 2 Parameter erwartet und Sie keine bereitstellen, erstellen Sie eine' Konstruktor'-Überladung, die keine Parameter erwartet, dann wird es keine Fehler mehr geben. –

+1

Welche Variablen benötigen Sie in den anderen Formen? Können Sie Ihren Code aktualisieren? –

+1

Den gleichen Namen für Felder und Parameter zu wählen, wird ein Chaos. Ich bevorzuge die Präfixierung der Felder mit _ –

Antwort

1

Sie versuchen, eine neue Instanz von frmHelp zu erstellen, aber keine Parameter zu übergeben.

Sie frmHelp Klasse haben nur einen Konstruktor mit zwei Parametern:

public frmHelp(frmOptions frmOptions1, frmLoginCreate frmLoginCreate) 
{ 
     InitializeComponent(); 
} 

Die einfache Antwort ist die vorherige zu ändern:

public frmHelp() 
{ 
    InitializeComponent(); 
} 

da Sie nicht mit diesen zwei Parametern etwas zu tun

0

Dies beantwortet nicht direkt Ihre Frage, aber könnte mit Ihrer Lösung helfen;

Ich würde lieber modal forms anstelle von normalen Formen verwenden.

Zum Beispiel: (dies ist nur ein Beispiel zu zeigen, wie es getan werden könnte)

public class FormMain : Form 
{ 
    // you might 'remember' the previous login name 
    private string _previousUsername; 

    private void ButtonLogin_Click(object sender, EventArgs e) 
    { 
     // create the login form 
     using(var loginForm = new FormLogin()) 
     { 
      // fillin the previous username 
      loginForm.Username = _previousUsername; 

      // this will block here, until the loginForm's DialogResult is set 
      var result = loginForm.ShowDialog(); 

      // if the form was closed (other than pressing ok), cancel login 
      if(result != DialogResult.OK) 
       return; 

      // verify loginForm.Username, loginForm.Password 
     } 
    } 

} 


public class FormLogin : Form 
{ 
    // wrapper properties, it wraps the textbox.Text, 
    // you don't want to expose the textbox directly, you might want to 
    // use some other controls in future as editbox, which will change the contract 
    // for classes that are using this control/form, which causes modifying code 
    // on more than one place, (also affects testing again). This way you can keep it 
    // separated. Classes dependend on the FormLogin, shouldn't be dependend 
    // on how it is presented.(UI) 
    public string Username 
    { 
     get { return textboxUsername.Text; } 
     set { textboxUsername.Text = value; } 
    } 

    public string Password 
    { 
     get { return textboxPassword.Text; } 
     set { textboxPassword.Text = value; } 
    } 

    private void ButtonLogin_Click(object sender, EventArgs e) 
    { 
     DialogResult = DialogResult.OK; 
    } 
} 

Und wenn Sie zu einem anderen Formulardaten übergeben wollen, können Sie eine Dataholder verwenden könnte Klasse.

Etwas wie:

// dataholder class 
public class MyDataHolder 
{ 
    public string UserName { get; set; } 
    public int MyId { get; set; } 
    public List<double> Whatever { get; set; } 
    public DateTime CreatedOn { get; set; } 
} 

// form1 
public class Form1: Form 
{ 
    // a field with a reference to the dataholder 
    private MyDataHolder _myData; 

    public Form1() 
    { 
     // create the data 
     _myData = new MyDataHolder(); 
     _myData.UserName = "Unknown"; 
     _myData.CreatedOn = DateTime.Now; 
    } 

    private void Button1_Click(object sender, EventArgs e) 
    { 
     // create the form2 and pass the data 
     using(Form2 form2 = new Form2(_myData)) 
      form2.ShowDialog(); 
    } 
} 

public class Form2 : Form 
{ 
    // a field with a reference to the dataholder 
    private MyDataHolder _myData; 

    public Form2(MyDataHolder myData) 
    { 
     // don't forget to assign it to the field 
     _myData = myData; 
    } 

    private void Button1_Click(object sender, EventArgs e) 
    { 
     // show the username 
     MessageBox.Show(_myData.UserName); 
    } 
} 

Nun verweisen beide Formen die gleichen Daten. Auf diese Weise entfernen Sie die Abhängigkeit von Form2 unter Form1. So können Sie die Form2 auch in anderen Formen wiederverwenden, solange Sie eine gültige MyDataHolder an die Form2 übergeben, wird es ausgeführt.Ein Form1 die Form2 und Form2 verwendet, die Form1 gibt Ihnen begrenzte Wiederverwertbarkeit verwendet, würden Sie geschriebenen Code wie stattdessen wieder zu verwenden umschreiben


;-) ich hoffe das du in dir Quest helfen ....

Verwandte Themen