最后一行和倒数第二行显示相同的' CurrentRow'指数

时间:2017-04-26 22:41:56

标签: c# winforms datagridview

在我的Winforms C#中的DataBound DataGridView(绑定到DataTable)中,我试图确定用户是否选择了每次向网格添加更多数据时自动添加的NewRow。如果选择NewRow,我想忽略删除行点击,但是在下面的2个屏幕截图中,datagridview1.CurrentRow.Index返回相同的值。非常感谢任何帮助!

enter image description here

在上述两种情况下,datagridview1.CurrentRow.Index都显示1

我尝试使用datagridview1.CurrentRow.IsNewRow,但因为索引显示的相同,显然无法正常工作。

这是deleteRow按钮的代码

private void btnDeleteRow_Click(object sender, EventArgs e)
{
    try
    {
        int currentRowIndex = dataGridView1.CurrentRow.Index; // TESTING DURING DEBUG, THIS PRODUCES THE SAME VALUE FOR BOTH ROWS PICTURED
        if (dataGridView1.CurrentRow.IsNewRow) return;
        var counter = dataGridView1.CurrentRow.Cells[0].Value;
        dataGridView1.Rows.RemoveAt(dataGridView1.CurrentRow.Index);
        new SqlCommand("DELETE FROM IncomingVisitorList WHERE Counter = " + counter, SqlConnection).ExecuteNonQuery();

    }
    catch { } // SUPPRESS/IGNORE NULL ROW EXCEPTION
}

1 个答案:

答案 0 :(得分:2)

我不确定为什么IsNewRow属性没有按照描述工作,我也不确定为什么返回的索引对于新行和带数据的最后一行是相同的。

以下是可能的解决方法。看来,如果你得到第一个int trueRowIndex = dataGridView1.SelectedCells[0].RowIndex;,它将返回正确的索引。

前一个语句将返回datagridView1.CurrentCell.RowIndex UNLESS 的相同索引,它是新行。下面的代码就是一个例子。

我希望我有一个更好的答案为什么,不幸的是,这个替代方案是我现在可以建议的唯一解决方案。我将尝试找出IsNewRow属性不能与DataBound项一起使用的原因。希望这会有所帮助。

private void btnDelete_Click(object sender, EventArgs e) {
  try {
    int currentRowIndex = dataGridView1.CurrentCell.RowIndex;
    int trueRowIndex = dataGridView1.SelectedCells[0].RowIndex;
    //MessageBox.Show("currentRowIndex " + currentRowIndex + " true row index: " + trueRowIndex);
    if (currentRowIndex != trueRowIndex) {
      MessageBox.Show("Row Is New Row");
    }
    else {
      MessageBox.Show("Row Is not New Row");
      dataGridView1.Rows.RemoveAt(dataGridView1.CurrentRow.Index);
      //new SqlCommand("DELETE FROM IncomingVisitorList WHERE Counter = " + counter, SqlConnection).ExecuteNonQuery();
    }
  }
  catch (Exception ex) {
    MessageBox.Show("Error: " + ex.Message);
  }
}