2015-03-31 29 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(); 
    } 
相關問題