将列表框项传递给另一个窗体 C# 上的文本框
本文关键字:窗体 文本 另一个 列表 | 更新日期: 2023-09-27 18:35:52
我正在用c#在Visual studio中制作这个简单的Windows表单应用程序。我有两种形式。在form1上,我有一个文本框,列表框和两个按钮(一个用于从文本框插入列表框,另一个用于打开form2)。在form2上,我只有一个文本框。我只是简单地想要,当单击form2上的按钮(用于打开form1)时,form2打开,文本框包含(在formLoad上)form1列表框中的选定项目。但是当我单击按钮时,它说"对象引用未设置为对象的实例"。我做错了什么?我很确定这是一件简单的事情,但我就是无法理解。
提前感谢!
这是我的代码:
在表单 1 上:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnOpenForm2_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Add(textBox1.Text);
}
public string Transfer
{
get { return listBox1.SelectedItem.ToString(); }
}
在表格 2 上:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
Form1 f1 = new Form1();
textBox1.Text = f1.Transfer;
}
因为在Form2_Load
事件中,您总是创建一个新的Form1
实例,然后访问Transfer
属性,该属性访问未为新创建的表单设置listBox1.SelectedItem
。
您应该在按钮事件中将裁判传递给表格 1:
在表单 1 上:
private void btnOpenForm2_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(this);
f2.ShowDialog();
}
在表格 2 上:
public partial class Form2 : Form
{
Form1 f1;
public Form2(Form1 f1)
{
this.f1 = f1;
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = this.f1.Transfer;
}
}
在 Form2_Load 方法中,您将创建对象 Form1 的新实例,该实例与现有项分开。
相反,您需要:a) 将对当前 Form1 对象的引用传递给 Form2,以便 Form2 可以访问 Transfer 属性。或 b) 向 Form2 添加一个新属性(例如,称为"传输"),然后在创建 Form2 时,将当前文本框值分配给此属性,如下所示:
Form2 f2 = new Form2();
f2.Transfer = listBox1.SelectedItem.ToString();
f2.ShowDialog();
您也可以通过向 Form2 的构造函数添加参数来执行此操作,尽管这实际上是一个设计决策。
因为您尚未选择列表框项,值列表框1.选定项为空。练习做尝试捕捉块
您在此处创建新的Form1
实例,该实例与您用于打开Form2
的 Form1 实例无关:
private void Form2_Load(object sender, EventArgs e)
{
Form1 f1 = new Form1(); // here is new instance of Form1 created
textBox1.Text = f1.Transfer;
}
因此,这个新的 Form1 实例没有选定的项目,并且您有错误。我建议您在打开Form2时将选定的项目值传递给Form2:
private void btnOpenForm2_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(Transfer); // pass selected item value to constructor
f2.ShowDialog();
}
您所需要的只是更改构造函数Form2
以接受此字符串:
public Form2(string transfer)
{
InitializeComponent();
textBox1.Text = transfer;
}