DatagridView 选择最后一行

Posted

技术标签:

【中文标题】DatagridView 选择最后一行【英文标题】:DatagridView Select last row 【发布时间】:2010-09-28 07:53:43 【问题描述】:

我在设置选定的 datagridview 中的最后一行时遇到了一些问题。我这样选择最后一行:

if (grid.Rows.Count > 0)

    try
    
        grid.Rows[grid.Rows.Count - 1].Selected = true;
        grid.CurrentCell = grid.Rows[grid.Rows.Count - 1].Cells[1]
    
    catch (IndexOutOfRangeException)
     
    catch (ArgumentOutOfRangeException)
     

当我执行这段代码时,我得到一个异常:IndexOutOfRangeException occurred: Index-1 没有值。

当我调试 Rowscollection 和相应的 Cells 集合时,我看到两个集合都已填满。该索引也存在于 Rows 和 Cells 集合中。

我不知道我在这里做错了什么。有人可以在这里帮助我吗?谢谢

编辑:

这里是完整的例外:

System.IndexOutOfRangeException: Index -1 does not have a value.
at System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
at System.Windows.Forms.CurrencyManager.get_Current()
at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e)
at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
at System.Windows.Forms.DataGridView.set_CurrentCell(DataGridViewCell value)

【问题讨论】:

代码看起来不错。你试过调试它吗?您在哪一行代码中遇到错误? 试一试grid.Rows[grid.Rows.Count - 1].Cells[1]快速观察,看看它会返回什么。 @Aseem:该行是:grid.CurrentCell = grid.Rows[grid.Rows.Count - 1].Cells[1] @KMan:然后我得到 IndexOutOfRangeException。当我做 grid.Rows[grid.Rows.Count - 1].Cells.Count 我得到 5 【参考方案1】:

试试:

dataGridView1.ClearSelection();//If you want

int nRowIndex = dataGridView1.Rows.Count - 1;
int nColumnIndex = 3;

dataGridView1.Rows[nRowIndex].Selected = true;
dataGridView1.Rows[nRowIndex].Cells[nColumnIndex].Selected = true;

//In case if you want to scroll down as well.
dataGridView1.FirstDisplayedScrollingRowIndex = nRowIndex;

提供以下输出:(最后一行,滚动并选中)

【讨论】:

@Martijn:我在发布之前测试了代码。究竟什么不起作用? 在线dataGridView1.Rows[nRowIndex].Cells[nColumnIndex].Selected = true; 我得到了烦人的异常 @Martijn:假设 exception 与您的问题相同。您是否手动插入任何行?在绑定之前? @KMan:在我选择最后一行之前,我运行此方法: private void AddAppointmentsToGrid(IList Appointments) Collection apps = dgViewAfspraak.DataSource as Collection; dgViewAfspraak.DataSource = null; foreach (约会中的约会应用) apps.Add(app); dgViewAfspraak.DataSource = 应用程序; (不知道如何在 cmets 中显示代码) ClearSelection - 救我一命))【参考方案2】:

我知道这可能有点晚,但它可能对其他人有用。

你试过了吗:

grid.Rows.Row[grid.Rows.Count -1].Selected = true;

在我的 Windows 应用程序中,我首先在我的 datagridview 中使用了你的代码,我遇到了同样的异常......然后在晚上我躺在床上时它出现了(我是编程新手)。

如果我写成:Rows[Rows.count-1],第一行是“0”和“0-1 = -1”,所以它超出范围:)

然后,当我将代码更改为 Rows.Row[index] 时,它起作用了! :)


如果您使用 c# 3.0 及更高版本,另一种选择:查看 CellAddress(); ;)

真诚的

【讨论】:

【参考方案3】:

您是否考虑过为此使用 Linq?

    grid.Rows.OfType<DataGridViewRow>().Last().Selected = true;
    grid.CurrentCell = grid.Rows.OfType<DataGridViewRow>().Last().Cells.OfType<DataGridViewCell>().First(); // if first wanted

【讨论】:

不,我没有。但我没有扩展方法Last()First()。我有使用 System.Linq 谢谢。尝试了您的解决方案,但我在此行得到了相同的异常:grid.CurrentCell = grid.Rows.OfType&lt;DataGridViewRow&gt;().Last().Cells.OfType&lt;DataGridViewCell&gt;().Last(); 在完全不使用索引属性的代码上获取 IndexOutOfRangeException 是没有意义的。确定是同一个例外?【参考方案4】:

IndexOutOfRangeException 的“catch”块为空,根本不会显示任何错误。

要么您的问题不准确,要么异常被抛出到其他地方。

编辑:查看了您添加的调用堆栈后,我可以看到错误确实不是在这里抛出,而是在@987654321 @ 类的 Current/Item 属性,最终由对 CurrentCell 设置器的调用触发。

底线:问题不在此代码中;设置当前单元格触发的其他一些代码会引发异常。

【讨论】:

它在调试模式下会抛出异常。代码停止运行,VS 高亮显示。但这不是重点。关键是,为什么会抛出异常? 我会使用“立即”窗口来确认 grid.Rows.Count 的值,然后尝试使用整数文字访问 grid.Rows[0] 或任何数字,以确保确定。我怀疑这里的代码不是导致异常的代码的精确副本,而在这与您认为您的代码正在执行的操作之间存在错误。 在即时窗口中,我在集合中有行和单元格 编辑:这并没有解决我的问题!我仍然有同样的例外。我仍然不知道出了什么问题。我只有这些事件处理程序:CellContentDoubleClickCellDoubleClick @Martijn - 您在 CurrencyManager 表单中发现了什么?在我在回答中提到的那些方法中,例外源自那里。在 Current 属性中的某处,您引用了 Item indexer 属性,索引为 -1,这显然不存在。【参考方案5】:
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;

【讨论】:

【参考方案6】:

最后一行是空的,因为它是用户可以添加新行的空行。无法选择此行。 你试过 grid.Rows.Count - 2 吗?作为替代方案,您可以将 AllowUserToAddRows 设置为 false。

【讨论】:

【参考方案7】:

为避免 IndexOutOfRangeException 确保只选择可见行。 我建议:

// Find last visible row
DataGridViewRow row = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => r.Visible).Last(); 
// scroll to last row if necessary
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.IndexOf(row);
// select row
row.Selected = true;

【讨论】:

【参考方案8】:

这很容易。采用: dataGridView.CurrentCell=dataGridView[ColumnIndex, RowIndex]; 数据网格视图[X,y]... 而不是 数据网格视图[Y, X]...

【讨论】:

以上是关于DatagridView 选择最后一行的主要内容,如果未能解决你的问题,请参考以下文章

DataGridView 行列的隐藏和删除

datagridview 设置行颜色 后 最后一行怎么设置不了呢

为啥Datagridview的最后一行不能排序?

datagridview怎样添加空白行到尾部(最后一行),而不是最后一行的前面插入

dataGridView 如何默认选中第一行

dataGridView 如何默认选中第一行