更新ListView上的SelectedItem

时间:2015-03-31 18:50:53

标签: c# winforms listview

我有一个ListView,它显示多行ListViewItems。用户可以通过单击编辑按钮来编辑行,该按钮打开另一个表单,显示所选行及其中的数据。 我遇到的问题是,当我按下更新按钮时,我似乎无法更新父窗体上的ListViewItem。我正在使用的代码不断抛出异常消息“ToDoList.exe中发生了'System.NullReferenceException'类型的未处理异常”。我尝试过不同的方法来更新所选项目,但似乎无法获得正常工作的代码。

这是我在显示所选行的表单上使用的代码,button1是应该更新listView的“Update Row”按钮。

private void button1_Click(object sender, EventArgs e)
    {
        Form1 form1 = (Form1)this.Owner;

        int i = 0;
        ListViewItem item = form1.listView1.SelectedItems[i];
        textBox1.Text = item.SubItems[0].Text;
        richTextBox1.Text = item.SubItems[1].Text;
        comboBox1.Text = item.SubItems[2].Text;
        dateTimePicker1.Text = item.SubItems[3].Text;

        this.Close();
    }

2 个答案:

答案 0 :(得分:0)

要使表单由另一个表单拥有,请为其所有者属性分配对将成为所有者的表单的引用。

https://msdn.microsoft.com/en-us/library/system.windows.forms.form.owner%28v=vs.110%29.aspx

您需要先设置所有者属性

答案 1 :(得分:0)

最后成功解决了这个问题。我的代码有两个问题。一个是关于我打开子Form3的方式,而不是将Form1称为类,另一个是我用来编辑行无法正常运行的代码。

将其更改为此并找到了解决方案;

Form1代码 - 使用所选行中的数据打开Form3的方法,最初使用代码:

private void button2_Click(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count == 0) return;

        Form3 form3 = new Form3();

        int i = 0;
        ListViewItem item = listView1.SelectedItems[i];
        string title = item.SubItems[0].Text;
        string description = item.SubItems[1].Text;
        string priority = item.SubItems[2].Text;
        string datedue = item.SubItems[3].Text;
        form3.textBox1.Text = title.ToString();
        form3.richTextBox1.Text = description.ToString();
        form3.comboBox1.Text = priority.ToString();
        form3.dateTimePicker1.Text = datedue.ToString();

        form3.Show();  
    }

但改为:

private void button2_Click(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count == 0) return;

        using (Form3 form3 = new Form3())
        {
            int i = 0;
            ListViewItem item = listView1.SelectedItems[i];
            string title = item.SubItems[0].Text;
            string description = item.SubItems[1].Text;
            string priority = item.SubItems[2].Text;
            string datedue = item.SubItems[3].Text;
            form3.textBox1.Text = title.ToString();
            form3.richTextBox1.Text = description.ToString();
            form3.comboBox1.Text = priority.ToString();
            form3.dateTimePicker1.Text = datedue.ToString();

            form3.ShowDialog(this);
        }
    }

最后将Form3中的代码更改为:

private void button1_Click(object sender, EventArgs e)
    {
        Form1 form1 = (Form1)this.Owner;

        int i = 0;
        ListViewItem item = form1.listView1.SelectedItems[i];
        item.SubItems[0].Text = textBox1.Text;
        item.SubItems[1].Text = richTextBox1.Text;
        item.SubItems[2].Text = comboBox1.Text;
        item.SubItems[3].Text = dateTimePicker1.Text;

        this.Close();
    }