【问题标题】:DataGridView row index always returns the same valueDataGridView 行索引总是返回相同的值
【发布时间】:2016-08-29 08:34:54
【问题描述】:

我正在尝试在我的 DataGridView 上实现 DeleteItem 功能。 我有以下事件:

private void btnDeleteDjelatnik_Click(object sender, EventArgs e)
{
    int idDjelatnik = -1;
    int index = djelatnikDataGrid.CurrentRow.Index;
    Int32.TryParse(djelatnikDataGrid.Rows[index].Cells[0].Value.ToString(), out idDjelatnik);
    r.DeleteDjelatnik(idDjelatnik);
}

我正在尝试获取选定的行 ID 列,以便将其传递给我的 Delete 方法:DeleteDjelatnik(int slectedID);

以下行总是给我 3 的值:

int index = djelatnikDataGrid.CurrentRow.Index;

我也试过

int index = djelatnikDataGrid.SelectedRows[0].Index; 

但我得到了 ArgumentOutOfRange 异常,是的,我的 SelectionMode 是在 FullRowSelect 上

如何让它工作?

【问题讨论】:

  • 试试 datagridview.CurrentCell.RowIndex
  • CurrentRowSelectedRow 可能不一样。 CurrentRow 将返回单元格处于活动状态的行。 SelectedRows 返回选择,因此您应该使用 djelatnikDataGrid.SelectedRows[0]
  • 我已经尝试过 datagridview.CurrentCell.RowIndex 并且无论我选择哪一行,我仍然得到值 3:/
  • 正如我所说的 int index = djelatnikDataGrid.SelectedRows[0].Index;抛出 ArgumentOutOfRange 异常
  • 这清楚地表明您没有选择任何行。

标签: c# winforms datagridview


【解决方案1】:

使用DataGridView的UserDeletingRow事件,

 private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
           int deletingRowIndex = e.Row.Index;
        }

希望有帮助,

【讨论】:

  • 哦,快点,我想我刚刚弄清楚为什么会出错...在我的 DataGridView 中,我尝试删除的项目被预先删除(因为我使用了 BindingNavigator),然后我的 RowIndex 更改为-1,然后当我调用我的方法从数据库中删除时,我删除了错误的项目(索引为 -1 的项目)...
  • 我肯定会在项目实际被删除之前使用这种方法来获取索引,这就是我整个混乱开始的地方xD
  • @ChenChi 很高兴听到有帮助:)
  • 事实证明,UserDeletingRow 没有触发,因为我在 BindingNavigator 中将 DeleteItem 属性设置为不同的方法......在我将 DeleteItem 属性设置为“None”后,我使用了原始事件“btnDeleteDjelatnik_Click”没有问题。真正的问题是我的 BindingNavigator 上的 DeleteItem 属性(它删除了我试图获取索引的行,所以它弄乱了行的索引)......所以我必须将此答案取消标记为解决方案
  • 请发布您与此问题相关的全部代码。 @陈驰
【解决方案2】:

由于 DataGridView 索引属性没有返回正确的值,我编写了这段代码:

public int djelatnikSelectedRowIndex { get; set; }

private void djelatnikDataGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
    djelatnikSelectedRowIndex = e.RowIndex;
}

【讨论】:

  • 嗯..SelectedRows[i].Index 从来没有让我失望过,从来没有... :)
  • 这对我没有帮助,哈哈 xD,似乎在后台发生了一些非常奇怪的事情
  • 如果我发现一些额外的信息为什么会发生这种情况,我会发布它
  • @Pikoh SelectedRows[i].Index 现在可以正常工作了!我想通了......真正的问题是我的 BindingNavigator 中的 DeleteItem 属性,因为它删除了我在实际执行“btnDeleteDjelatnik_Click”事件之前选择的索引上的行 - 所以它弄乱了行的索引!!
  • 好的,很明显在另一个地方出了点问题,因为SelectedRows 应该总是返回正确的。很高兴你明白了:)
【解决方案3】:

真正的问题是我的 BindingNavigator 中的 DeleteItem 属性!

在我将其设置为“无”之前,它会在执行“btnDeleteDjelatnik_Click”之前从我的 DataGridView 中删除该行并弄乱索引,因此我无法获得我想要删除的行的真实 ID!

我的方法现在看起来像这样:

private void btnDeleteDjelatnik_Click(object sender, EventArgs e)
        {
            int index = djelatnikDataGrid.SelectedRows[0].Index;
            int idDjelatnik = -1;
            Int32.TryParse(djelatnikDataGrid["IDDjelatnik", index].Value.ToString(), out idDjelatnik);
            r.DeleteDjelatnik(idDjelatnik);
            djelatnikDataGrid.Rows.RemoveAt(index);
        }

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2019-10-22
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多