更新 ListView 上的 SelectedItem

Update SelectedItem on ListView

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

这是我在显示所选行的表单上使用的代码,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();
    }

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

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

您需要先设置所有者属性

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

改成这样,得出解决方案;

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();
    }