在表单之间传递数据为空

时间:2017-05-29 11:27:56

标签: c# forms winforms

我有两种形式,form1,用户可以选择要编辑的文件,form2,用户可以编辑数据。下面是form1 listView的代码,用户在其中选择要编辑的文件:

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

以下是第二种表单的代码,用户应该可以在其中编辑数据:

 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 string[] _AccountData;
public string[] AccountData
{
    get { return _AccountData; }
    set { _AccountData = value; }
}

这是我用来在表单之间传递数据的方法,但每当我尝试显示数据时,它总是挂在第二个表单上,因为它显示f1.AccountData is null,即使其中有数据(如果我设置一个断点,它以第一种形式显示数据,但不传递给第二种形式。

我对使用多种表单相对较新,所以我不确定需要编辑哪些代码才能工作。为什么第二种形式的值显示为null,当它以第一种形式显示值时?

1 个答案:

答案 0 :(得分:2)

以下行创建了一个全新的Form1实例:

Form1 f1 = new Form1();

新实例有一组新的控件和属性,与您在打开Form1之前的Form2实例无关。

要使代码正常运行,您应该将对Form1的现有实例的引用传递给Form2,而不是创建Form1的新实例。

或者更好 - 仅将数据传递给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();
}