我有两种形式,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,当它以第一种形式显示值时?
答案 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();
}