我试图在单击ListView所在表单中不同表单的按钮时填充ListView。我在Form1中创建了一个在Form2中使用的方法,并将参数传递给Form1中的方法,然后填充ListView。当我调试时,我得到了所有传递的正确值,但ListView仍然没有填充。无论我是否为ListView设置Modifier属性为Public。这是我的代码,为了简单起见,我为此而愚蠢。
Form1(只有一个ListView和一个用于打开Form2的按钮)
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void setLvi(string name, string age, string dob)
{
ListViewItem lvi = new ListViewItem(name);
lvi.SubItems.Add(age);
lvi.SubItems.Add(dob);
listView1.Items.Add(lvi);
}
private void button1_Click(object sender, EventArgs e)
{
Form2 fm3 = new Form2();
fm3.Show();
}
}
}
表单2(它只有一个应该填充ListView的按钮)
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form1 fm2 = new Form1();
string name2 = "Chris";
string age2 = "23";
string dob2 = "12/19/1989";
fm2.setLvi(name2, age2, dob2);
}
}
}
答案 0 :(得分:2)
简短的回答是您正在创建的新Form1
未显示,因此您对列表视图所做的更改不会反映在表单的任何可视化表示中。所以你可以保留你拥有的代码,但是在你在按钮处理程序中创建的.Show()
对象上调用fm2
,但我建议你重新考虑你的方法,因为可能有你不想要的东西抛弃Form1
,例如可能在其存在时填充的其他控件。
相反,请考虑一下:
Form2
的{{1}}实例与您认为的实例不同,因为您正在新建另一个Form1
实例。
Form1
而是这样做:
private void button1_Click(object sender, EventArgs e)
{
// fm2 is not the same Form1 that created this Form2 object
Form1 fm2 = new Form1();
string name2 = "Chris";
string age2 = "23";
string dob2 = "12/19/1989";
fm2.setLvi(name2, age2, dob2);
}
我们更改了public partial class Form2 : Form
{
public Form1 TheForm1 { get; set; }
public Form2(Form1 _form1)
{
TheForm1 = _form1;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string name2 = "Chris";
string age2 = "23";
string dob2 = "12/19/1989";
TheForm1.setLvi(name2, age2, dob2);
}
}
的构造函数以接受Form2
的实例,我们将其存储在属性Form1
中,这样我们就可以调用TheForm1
方法在setLvi
班。
现在我们必须改变我们实例化Form1
的方式,如下所示:
Form2
注意:private void button1_Click(object sender, EventArgs e)
{
Form2 fm3 = new Form2(this);
fm3.Show();
}
表示当前类的实例,它将是this
,因为我们在新建Form1
对象时就在该类中。