2017-05-29 14 views
0

私は、ユーザーが編集するファイルを選択できるform1と、ユーザーがデータを編集できるform2という2つのフォームを持っています。ユーザーが編集するファイルを選択するにはForm1のListViewコントロールのためのコードの下:フォーム間のデータの受け渡しはnullです

private void Form2_Load(object sender, EventArgs e) 
{ 
    Form1 f1 = new Form1(); 
    string[] accData = f1.AccountData; 
    string[] test1 = accData.ToString().Split(';'); 
    oldUsername.Text = test1[0]; 
    oldPass.Text = test1[1]; 
    //and so on  
} 

プロパティ:

private void listView1_DoubleClick(object sender, EventArgs e) 
{ 
    _AccountData = File.ReadAllLines(listView1.SelectedItems[0].Tag.ToString()); 
    Form2 passForm = new Form2(); 
    passForm.ShowDialog(); 
} 

ここでは、ユーザがデータを編集できるようにすべきでは二番目の形式、のためのコードがありますデータ渡す:

private string[] _AccountData; 
public string[] AccountData 
{ 
    get { return _AccountData; } 
    set { _AccountData = value; } 
} 

する。これは私がフォーム間でデータを渡すために使用するものですが、私はデータを表示しようとするたびに、それがそのf1.AccountData is null、電子を示しているので、それは常に、第二の形式でハング私はブレークポイントを置くとデータは最初の形式で表示されますが、2番目の形式には渡されません)。

私はいくつかのフォームで作業するのが比較的新しいので、コードを動作させるために何を編集する必要があるのか​​よく分かりません。最初のフォームに値が表示されたときに、値が2番目のフォームでnullであることが表示されるのはなぜですか?

+0

Form2でコンストラクタまたはプロパティを作成し、_Acco untData値を入力し、フォームを表示します。 –

+0

これは数百万回も前に尋ねられており、答えが正しいと(大きな驚き)。閉鎖に投票しました – EpicKip

答えて

2

次の行はForm1の全く新しいインスタンスを作成します。

Form1 f1 = new Form1(); 

新しいインスタンスはあなたがForm2を開く前に持っていたForm1インスタンスに関連していないコントロールとプロパティの新しいセットを持っています。

コードを機能させるには、新しいインスタンスForm1を作成する代わりに、既存のインスタンスForm1Form2への参照を渡す必要があります。

他のフォームへの参照を渡さずにForm2にデータのみを渡してください。例えば。 (代わりに、文字列の配列の)アカウントデータを保持するために使用するクラスAccount

public class Account 
{ 
    public string UserName {get;set;} 
    public string Password {get;set;} 
    // etc 
} 

そしてForm2コンストラクタでAccountタイプのパラメータを追加し、アカウントのインスタンスの値でフォームコントロールを初期化:

public Form2(Account account) 
{ 
    InitializeComponent(); 
    oldUsername.Text = account.UserName; 
    oldPass.Text = account.Password;   
} 

そして作成時に値を指定するForm2

private void listView1_DoubleClick(object sender, EventArgs e) 
{ 
    // better store `Account` instance in private fields 
    _AccountData = File.ReadAllLines(listView1.SelectedItems[0].Tag.ToString()); 
    Account account = new Account { 
     UserName = _AccountData[0], 
     Password = _AccountData[1] 
     // etc 
    }; 

    Form2 passForm = new Form2(account); 
    passForm.ShowDialog(); 
} 
+0

既存のフォームからどのくらい正確にリファレンスを渡しますか?データを直接渡す方法は?フィールドを公開しますか?私はそれを避けたいと思います。 – EInherjar

+0

@EInherjar:外部呼び出し側が値を設定できるようにする 'Form2'でパブリックメソッドを作ります。次に、 'Form1'がそのメソッドを呼び出して値を設定します。メソッドとは対照的に、プロパティを使用する際に問題はありません。あなたがそうでない限り。会社のコーディング標準を遵守しようとしています。 – Flater

+0

申し訳ありませんが、長年のご返答ありがとうございました。しかし、クラスとそのフィールドを公開するのには少し問題があります。そうするのがベストプラクティスですか?どのように私はフィールドを保護するだろうか? – EInherjar

関連する問題