【问题标题】:FormClosing does not see DataGridView Rows and ColumnsFormClosing 看不到 DataGridView 行和列
【发布时间】:2024-01-19 08:10:01
【问题描述】:

请问这是怎么回事:
Form2_Closing:

Form1.DataGridView1.Rows[0].Cells[1].Value = "323";

错误:索引超出范围。必须是非负数且小于 集合的大小。参数名称:索引

Form1 上的 DGV 有 10 行 14 列

【问题讨论】:

  • 为什么要在表单关闭时更改值?我的猜测是你应该在它关闭之前这样做。
  • 在该行之前设置一个断点并找出 DataGridView1 说它有多少行,以及多少个单元格。
  • 我在 Form1 而不是 Form2 上更改 DGV
  • NominSim,它是FormClosing中唯一的一行代码。如果我设置断点 - 什么都不会发生。
  • 你应该仍然可以设置一个。单击实际的 FormClocing 方法行,而不是代码行。当然只有在Form2关闭时才会触发。

标签: c# winforms datagridview


【解决方案1】:

创建一个新的 Winforms 项目并添加一个按钮及其单击处理程序和一个 TextBox [使其可访问,以便孩子可以设置值。我现在已经在设计器中公开了]。然后在此表单上添加以下代码。此外,在项目中添加一个新窗体 (Form2)。

private void button1_Click(object sender, EventArgs e)
        {
            var child = new Form2();
            child.FormClosing += new FormClosingEventHandler(ChildFormClosing);
            this.Enabled = false;
            child.Show(this);
        }

        void ChildFormClosing(object sender, FormClosingEventArgs e)
        {
            var child = sender as Form2;
            if (child != null)
            {
                if (child.DialogResult == DialogResult.None)
                {
                    // do data grid view manipulation here 
                    // for ex:
                   (child.Owner as Form1).textBox1.Text = "Hi";
                }
            }
            Enabled = true;
        }

【讨论】:

    【解决方案2】:

    从您的 cmets 看来,您正在尝试创建一个自定义对话框,该对话框将在调用表单上的 DataGridView 中操作特定值。我建议查看this 创建自定义消息框的示例。

    您将能够返回您希望 DataGridViewCell 更新为的值,然后将其设置在您的 Form1 上。

    【讨论】:

    • Form2 不是自定义对话框,它是一个普通的表单,上面有 DGV 和其他控件。
    • 不过,您将它用作对话框,因此应该适用相同的原则。
    最近更新 更多