2017-03-22 3 views
0

私はWinFormsとコンソールアプリケーションでC#を学んでいます。別のフォーム変数にアクセスする際に問題があります。新しいフォームオブジェクトを宣言するのではなく、別のフォームから変数を使用するために、変数を含む同じフォームインスタンスを使用する必要があることに気付きました。フォームを変更した後、私は修正できないProgram.csファイルにエラーが発生しました。 FormsでC#を使用するのは初めてです。これがnoobエラーの場合は、事前にお詫びください。ここでX他のフォーム変数へのアクセス

あなたがより良い理解を得ることができるようにフォームの背後にあるコードです:クラスのオブジェクトを宣言することは私には新しいです

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(); 
    } 
} 

これは私の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()); 
     } 
    } 

これは私が私のProgram.csファイルで取得エラーです:必要な正式な パラメーター「frmHelp.frmHelp(frmOptions、 frmLoginCreate)」の「frmOptions1」に対応して与えられた引数はありません

+1

2つのパラメータを必要とする 'frmHelp'フォーム内の唯一の' constructor'は、noneを提供していますが、パラメータを期待しないコンストラクタオーバーロードを作成し、エラーはもう発生しません。 –

+1

他のフォームにはどのような変数が必要ですか?コードを更新できますか? –

+1

フィールドとパラメータに同じ名前を使用すると、混乱することになります。フィールドの先頭に '_'を付けるのが好きです –

答えて

1

frmHelpの新しいインスタンスを作成しようとしていますが、パラメータは渡していません。

あなたfrmHelpクラスは二つのパラメータを持つ唯一のコンストラクタがあります。

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

を簡単な答えは、前を変更することです:あなたはそれらの2つのパラメータで何もしていないので

public frmHelp() 
{ 
    InitializeComponent(); 
} 

0

これはあなたの質問に直接答えませんが、あなたの解決策に役立つかもしれません。

通常のフォームの代わりにmodal formsを使用することをお勧めします。例えば

(これは、それが行うことができる方法を示すための単なる一例である)

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; 
    } 
} 

そして、あなたは別のフォームにデータを渡したい場合は、あなたがDataHolderを使用することができますクラス。今、両方のフォームが同じデータを参照している

// 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); 
    } 
} 

:よう

何か。このようにしてForm2からの依存関係をForm1に削除します。したがって、有効なMyDataHolderForm2に渡す限り、他​​の形式のForm2も再利用することができます。Form1を使用していますForm2Form2を使用していますForm1はあなたに制限された再利用性を与え、私はこれがあなたの探求であなたを助けることを願っ代わりにそれを書き換える;-)


書かれたコードを再利用したいのですが....

関連する問題