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 没有值。
当我调试 Rows
collection 和相应的 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<DataGridViewRow>().Last().Cells.OfType<DataGridViewCell>().Last();
在完全不使用索引属性的代码上获取 IndexOutOfRangeException 是没有意义的。确定是同一个例外?【参考方案4】:
IndexOutOfRangeException 的“catch”块为空,根本不会显示任何错误。
要么您的问题不准确,要么异常被抛出到其他地方。
编辑:查看了您添加的调用堆栈后,我可以看到错误确实不是在这里抛出,而是在@987654321 @ 类的 Current
/Item
属性,最终由对 CurrentCell
设置器的调用触发。
底线:问题不在此代码中;设置当前单元格触发的其他一些代码会引发异常。
【讨论】:
它在调试模式下会抛出异常。代码停止运行,VS 高亮显示。但这不是重点。关键是,为什么会抛出异常? 我会使用“立即”窗口来确认 grid.Rows.Count 的值,然后尝试使用整数文字访问 grid.Rows[0] 或任何数字,以确保确定。我怀疑这里的代码不是导致异常的代码的精确副本,而在这与您认为您的代码正在执行的操作之间存在错误。 在即时窗口中,我在集合中有行和单元格 编辑:这并没有解决我的问题!我仍然有同样的例外。我仍然不知道出了什么问题。我只有这些事件处理程序:CellContentDoubleClick
和CellDoubleClick
@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 设置行颜色 后 最后一行怎么设置不了呢