2015-03-31 55 views
0

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

这是我在显示选定行的窗体上使用的代码,button1是应更新listView的“更新行”按钮。

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

你检查,如果在调试时,form1'是NULL或'form1.listView1'是'NULL'吗? – ibiza 2015-03-31 18:51:53

+0

在调试中它说form1为空。它指出“附加信息:对象引用未设置为对象实例” – DanH95 2015-03-31 19:14:13

+0

请看我的答案,您必须事先手动设置“所有者”字段。 – ibiza 2015-03-31 19:24:11

回答

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