2016-07-16 6 views
0

У меня есть DataGridView с именем dataGridView1, где я создал 9 столбцов для получения сведений о сотрудниках и двух дополнительных столбцах для EditLinkCellColumn и DeleteLinkCellColumn для выполнения редактирования и удалить операции. Метод, показанный ниже, добавляет запись в первый раз в datagridview.Ошибка System.IndexOutOfRangeException в winform, когда ячейка EditLink и ячейка DeleteLink нажата в 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; 
    } 

Я написал метод, описанный ниже для стрельбы редактировать и удалять ссылку клетки, но он показывает IndexOutOfRangeException ошибки на линии, если (dtEmployee.Columns [ColumnIndex] .ColumnName == «Edit») говорят, что оно не может найти столбец 9, а также на линии еще если (dtEmployee.Columns [e.ColumnIndex] .ColumnName == "Удалить") говорят, что не может найти столбец 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()); 
     } 
    } 

ответ

0
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()); 
    } 
0

Попробуйте заменить свой CellContentClick Event Handler с этим.

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()); 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^