【问题标题】:System.IndexOutOfRangeException error in winform when EditLink cell and DeleteLink cell is clicked upon in DataGridView在 DataGridView 中单击 EditLink 单元格和 DeleteLink 单元格时,winform 中出现 System.IndexOutOfRangeException 错误
【发布时间】:2023-03-29 14:06:01
【问题描述】:

我有一个名为 dataGridView1 的 DataGridView,我在其中创建了 9 个列用于获取员工的详细信息,并为 EditLinkCellColumn 和 DeleteLinkCellColumn 创建了 2 个附加列,用于执行编辑和删除操作。下面的方法是在datagridview中第一次添加记录。

private void AddFirstRecord()
    {
        dtEmployee = new DataTable();
        dtEmployee.Columns.Add("First Name");
        dtEmployee.Columns.Add("Last Name");
        dtEmployee.Columns.Add("City");
        dtEmployee.Columns.Add("Date of birth");
        dtEmployee.Columns.Add("Email");
        dtEmployee.Columns.Add("Gender");
        dtEmployee.Columns.Add("Contact");
        dtEmployee.Columns.Add("Income");
        dtEmployee.Columns.Add("Experience");
        DataRow drEmployee = dtEmployee.NewRow();
        drEmployee[0] = txtFirstName.Text;
        drEmployee[1] = txtLastName.Text;
        drEmployee[2] = txtCity.Text;
        drEmployee[3] = mtxtDateofBirth.Text;
        drEmployee[4] = txtEmail.Text;
        if (rdbMale.Checked)
            drEmployee[5] = rdbMale.Text;
        else
            drEmployee[5] = rdbFemale.Text;
        drEmployee[6] = mtxtContact.Text;
        drEmployee[7] = txtIncome.Text;
        drEmployee[8] = cmbExperience.Text;
        dtEmployee.Rows.Add(drEmployee);
        dataGridView1.DataSource = dtEmployee;

        dataGridView1.AutoGenerateColumns = false;
        DataGridViewLinkColumn EditLink = new DataGridViewLinkColumn();
        EditLink.UseColumnTextForLinkValue = true;
        EditLink.HeaderText = "Edit";
        EditLink.LinkBehavior = LinkBehavior.SystemDefault;
        EditLink.Text = "edit";
        dataGridView1.Columns.Add(EditLink);
        DataGridViewLinkColumn DeleteLink = new DataGridViewLinkColumn();
        DeleteLink.UseColumnTextForLinkValue = true;
        DeleteLink.HeaderText = "Delete";
        DeleteLink.LinkBehavior = LinkBehavior.SystemDefault;
        DeleteLink.Text = "delete";
        dataGridView1.Columns.Add(DeleteLink);
        dataGridView1.DataSource = dtEmployee;
    }//AddFirstRecord       

AddNewRecord() 方法用于在添加第一条记录后添加记录。

  private void AddNewRecord()
    {
        DataRow drEmployee = dtEmployee.NewRow();
        drEmployee[0] = txtFirstName.Text;
        drEmployee[1] = txtLastName.Text;
        drEmployee[2] = txtCity.Text;
        drEmployee[3] = mtxtDateofBirth.Text;
        drEmployee[4] = txtEmail.Text;
        if (rdbFemale.Checked)
            drEmployee[5] = rdbFemale.Text;
        else
            drEmployee[5] = rdbMale.Text;
        drEmployee[6] = mtxtContact.Text;
        drEmployee[7] = txtIncome.Text;
        drEmployee[8] = cmbExperience.Text;
        dtEmployee.Rows.Add(drEmployee);
        dataGridView1.DataSource = dtEmployee;
    }

我已经编写了下面显示的方法来触发编辑和删除链接单元格,但它在 if (dtEmployee.Columns[columnIndex].ColumnName == "Edit") 行显示错误 IndexOutOfRangeException 说它找不到第 9 列并且在 else if (dtEmployee.Columns[e.ColumnIndex].ColumnName == "Delete") 说它找不到第 10 列。

 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        try
        {
            int columnIndex = e.ColumnIndex;
            int rowIndex = dataGridView1.CurrentCell.RowIndex;

            if (dtEmployee.Columns[columnIndex].ColumnName == "Edit")
            {
                dataGridView1.BeginEdit(true);
                dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
            }
            else if (dtEmployee.Columns[e.ColumnIndex].ColumnName == "Delete")
            {
                if (MessageBox.Show("Are you sure you want to delete?", "Deleting...", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    dtEmployee.Rows.RemoveAt(rowIndex);
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show("Sorry for the inconvenience" + ex.ToString() );
        }
    }

【问题讨论】:

    标签: c# .net winforms datagridview indexoutofrangeexception


    【解决方案1】:
    try
        {
            int columnIndex = e.ColumnIndex;
            int rowIndex = dataGridView1.CurrentCell.RowIndex;
    
            if (dataGridView1.Columns[columnIndex].HeaderText == "Edit")
            {
                dataGridView1.BeginEdit(true);
                dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
            }
            else if (dataGridView1.Columns[e.ColumnIndex].HeaderText == "Delete")
            {
                if (MessageBox.Show("Are you sure you want to delete?", "Deleting...", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    dtEmployee.Rows.RemoveAt(rowIndex);
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show("Sorry for the inconvenience" + ex.ToString() );
        }
    

    【讨论】:

      【解决方案2】:

      尝试用这个替换您的 CellContentClick 事件处理程序。

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
          {
              try
              {
                  int columnIndex = e.ColumnIndex;
                  int rowIndex = e.RowIndex;
                  string columnValue = dtEmployee.Rows[rowIndex].Cells[columnIndex].HeaderText.ToString();
      
                  if (columnValue == "Edit")
                  {
                      dataGridView1.BeginEdit(true);
                      dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
                  }
                  else if (columnValue == "Delete")
                  {
                      if (MessageBox.Show("Are you sure you want to delete?", "Deleting...", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                          dtEmployee.Rows.RemoveAt(rowIndex);
                  }
              }
              catch(Exception ex)
              {
                  MessageBox.Show("Sorry for the inconvenience" + ex.ToString() );
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2012-09-08
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多