【问题标题】:Update SelectedItem on ListView更新 ListView 上的 SelectedItem
【发布时间】:2015-03-31 18:50:53
【问题描述】:

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

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

【问题讨论】:

  • 您是否在调试中检查过form1NULL 还是form1.listView1NULL
  • 在调试中说 form1 为空。它声明“附加信息:对象引用未设置为对象的实例”
  • 请看我的回答,你得提前手动设置Owner字段。
  • 我已经尝试过了,但我仍然遇到同样的错误。

标签: c# winforms listview


【解决方案1】:

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

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

需要先设置 Owner 属性

【讨论】:

    【解决方案2】:

    终于解决了这个问题。我的代码有两个问题。一个是我打开子 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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多