【问题标题】:Error when accessing a control's data of one form in another form in C#在 C# 中以另一种形式访问一个形式的控件数据时出错
【发布时间】:2012-08-05 15:42:26
【问题描述】:

我的申请中有两个表格。在我的 Form1 中,我有一个包含一些项目的列表视图。当我双击一行时,我应该得到一个弹出窗口,允许我编辑行值。为此,我使用了双击事件。现在对于弹出窗口,我创建了新表单 - Form2。我已将列表视图设置为 Form1 中的内部,以便访问我的 form2 中的选定行值。在 form2 加载中,我正在检索要在文本框中显示的所选行的值,但这给了我错误。这是我的代码:

   //this is in form1
   private void bufferedListView1_DoubleClick(object sender, EventArgs e)
    {
        form2 obj = new form2();
        obj.ShowDialog();
    }

   //in form2
   Form1 o = new Form1();
   private void form2_Load(object sender, EventArgs e)
    {
        txt_editname.Text = o.bufferedListView1.SelectedItems[0].SubItems[0].Text;
        txt_editno.Text = o.bufferedListView1.SelectedItems[0].SubItems[1].Text;
    }

我得到的错误是:InvalidArgument=Value of '0' is not valid for 'index'. Parameter name: index

我哪里错了?

【问题讨论】:

  • 哦,为什么会这样?我不只是为 form1 创建一个对象吗?

标签: c# winforms listview


【解决方案1】:

在form2的构造函数中传递需要的数据

public form2(string text1, string text2)
{
   //work with values
}

并将调用代码更改为:

private void bufferedListView1_DoubleClick(object sender, EventArgs e)
{
    form2 obj = new form2(bufferedListView1.SelectedItems[0].SubItems[0].Text,
       bufferedListView1.SelectedItems[0].SubItems[1].Text);
    obj.ShowDialog();
}

【讨论】:

  • 我现在有一个新问题。我用了你的方法,效果很好。但问题是下次我单击一行时,错误会重复出现。这是因为我不是每次都丢弃该对象。所以我加了这个:obj = null; GC.Collect(); 但是还是有一个典型的问题,点击几下后,错误又重复了。为什么会这样?
  • 当表单显示为模态对话框时,单击关闭按钮(表单右上角带有 X 的按钮)会导致表单隐藏,因为表单显示为一个对话框被隐藏而不是关闭,当您的应用程序不再需要该表单时,您必须调用该表单的 Dispose 方法。见评论msdn.microsoft.com/en-us/library/c7ykbedk.aspx
  • 是的,我确实给了一个取消按钮并在里面写了this.Dispose();。我在列表视图中单击,form2 打开,然后我使用取消按钮关闭。我做了 3-4 次然后我得到错误
  • 为了澄清,您到底遇到了什么错误?并且有表单的 Close() 方法,它应该做一个正确的关闭表单。
  • 这不是与表单相关的错误,它告诉您您正在尝试访问超出其范围的某个数组。 form2 obj = new form2(bufferedListView1.SelectedItems[0].SubItems[0].Text, bufferedListView1.SelectedItems[0].SubItems[1].Text);此代码包含对索引 0 处的 SelectedItems 的直接调用,但如果没有选定项,则会引发此异常。
【解决方案2】:
Form1 o = Application.OpenForms["Form1"] as Form1;
private void form2_Load(object sender, EventArgs e)
{
    txt_editname.Text = o.bufferedListView1.SelectedItems[0].SubItems[0].Text;
    txt_editno.Text = o.bufferedListView1.SelectedItems[0].SubItems[1].Text;
}

您应该检索已经创建的 Form1 的实例,而不是新的实例。

【讨论】:

    【解决方案3】:

    你的代码应该是这样的:

        //this is in form1
        private void bufferedListView1_DoubleClick(object sender, EventArgs e)
        {
            form2 obj = new form2
                            {
                                Name = o.bufferedListView1.SelectedItems[0].SubItems[0].Text,
                                No = o.bufferedListView1.SelectedItems[0].SubItems[1].Text,
                            };
            obj.ShowDialog();
        }
    
        //in form2
        public String Name;
        public String No;
        Form1 o = new Form1();
        private void form2_Load(object sender, EventArgs e)
        {
            txt_editname.Text = Name;
            txt_editno.Text = No;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      相关资源
      最近更新 更多