更新 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();
}
我有一个显示多行 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();
}