0

当单击与 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);
        }
    }
}
4

1 回答 1

2

简短的回答是Form1没有显示您正在创建的新内容,因此您对列表视图所做的更改不会反映在表单的任何视觉表示中。所以你可以保留你拥有的代码,但调用你在按钮处理程序中创建.Show()fm2对象,但我建议你重新考虑你的方法,因为可能有些东西你不想扔掉Form1,比如其他控件如果或当它们存在时可能会被填充。

而是考虑这个:

Form2有一个与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时我们就在那个类中。Form2

于 2013-08-11T02:20:00.277 回答