如何在另一个窗体上访问ListView控件

时间:2013-08-11 02:08:47

标签: c#

我试图在单击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);
        }
    }
}

1 个答案:

答案 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对象时就在该类中。