如何使 DataGridView 显示选定的行?
Posted
技术标签:
【中文标题】如何使 DataGridView 显示选定的行?【英文标题】:How do I make the DataGridView show the selected row? 【发布时间】:2012-01-16 07:09:39 【问题描述】:我需要强制DataGridView
显示选定的row
。
简而言之,我有一个 textbox
,它根据输入到 textbox
中的内容更改 DGV
选择。发生这种情况时,选择会更改为匹配的row
。
不幸的是,如果选定的 row
不在视图中,我必须手动向下滚动才能找到选择。有谁知道如何强制DGV
显示选定的row
?
谢谢!
【问题讨论】:
只需设置 CurrentCell 属性,DGV 将滚动使其可见。 【参考方案1】:你可以设置:
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;
这是此属性的MSDN documentation。
【讨论】:
谢谢!我一直在努力寻找在使用 CurrentCell 时无法普遍使用的逻辑错误。但我可以将我一直使用的行号插入其中,它就像一个魅力! 简单完美(y)【参考方案2】:只需在选择行之后放置该行:
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;
【讨论】:
错过了一分钟!【参考方案3】:这一项滚动到选定的行而不把它放在顶部。
dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];
【讨论】:
绝对比DataGridView.FirstDisplayedScrollingRowIndex
更人性化,谢谢!
与 FirstDisplayedScrollingRowInde 不同,这也会将行箭头移动到正确的行,选择行,并取消选择任何其他行。
dataGridView1.CurrentCell = dataGridView1.SelectedRows[0].Cells[0]
但是,如果第一列已被隐藏,则会抛出异常。【参考方案4】:
int rowIndex = -1;
foreach (DataGridViewRow row in dataGridView1.Rows)
if (row.Cells[0].Value.ToString().Equals(searchString))
rowIndex = row.Index;
break;
if (rowIndex >= 0)
dataGridView1.CurrentCell = dataGridView1[visibleColumnIndex, rowIndex];
visibleColumnIndex - 所选单元格必须可见
【讨论】:
【参考方案5】:做这样的事情:
dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];
只有在第一列可见时才有效。如果它是隐藏的,你会得到一个例外。这样更安全:
var column = dataGridView1.CurrentCell != null ?
dataGridView1.CurrentCell.ColumnIndex :
dataGridView1.FirstDisplayedScrollingColumnIndex;
dataGridView1.CurrentCell = dataGridView1.Rows[iNextHighlight].Cells[column];
如果目标行已经在屏幕上,这将重置选择而不滚动。它还保留了当前列选择,这在您允许内联编辑的情况下很重要。
【讨论】:
【参考方案6】:我制作了下一个搜索功能,它非常适合在显示中滚动选择。
private void btnSearch_Click(object sender, EventArgs e)
dataGridView1.ClearSelection();
string strSearch = txtSearch.Text.ToUpper();
int iIndex = -1;
int iFirstFoundRow = -1;
bool bFound = false;
if (strSearch != "")
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
/* Select All Rows Starting With The Search string in row.cells[1] =
second column. The search string can be 1 letter till a complete line
If The dataGridView MultiSelect is set to true this will highlight
all found rows. If The dataGridView MultiSelect is set to false only
the last found row will be highlighted. Or if you jump out of the
foreach loop the first found row will be highlighted.*/
foreach (DataGridViewRow row in dataGridView1.Rows)
if ((row.Cells[1].Value.ToString().ToUpper()).IndexOf(strSearch) == 0)
iIndex = row.Index;
if(iFirstFoundRow == -1) // First row index saved in iFirstFoundRow
iFirstFoundRow = iIndex;
dataGridView1.Rows[iIndex].Selected = true; // Found row is selected
bFound = true; // This is needed to scroll de found rows in display
// break; //uncomment this if you only want the first found row.
if (bFound == false)
dataGridView1.ClearSelection(); // Nothing found clear all Highlights.
else
// Scroll found rows in display
dataGridView1.FirstDisplayedScrollingRowIndex = iFirstFoundRow;
【讨论】:
这是我用的。【参考方案7】:也考虑一下这段代码(使用 from compatible_tech 建议的方式):
private static void EnsureVisibleRow(DataGridView view, int rowToShow)
if (rowToShow >= 0 && rowToShow < view.RowCount)
var countVisible = view.DisplayedRowCount(false);
var firstVisible = view.FirstDisplayedScrollingRowIndex;
if (rowToShow < firstVisible)
view.FirstDisplayedScrollingRowIndex = rowToShow;
else if (rowToShow >= firstVisible + countVisible)
view.FirstDisplayedScrollingRowIndex = rowToShow - countVisible + 1;
【讨论】:
一个非常实用的答案...值得更多的投票。 我同意,所以我投了赞成票!它比任何其他解决方案都更有效。 效果很好 - 如果调用者没有设置,我将 rowToShow 设置为可选并将其设置为最后一行。现在它默认滚动到底部。可以添加另一个签名来给它一个更好的名字。 谢谢。这比其他答案好得多。给其他用户的提示:我对其进行了一些修改以传入 firstVisible,因为我的列表也在我需要调用 EnsureVisibleRow 之前被刷新(刷新 DataGridView 内容后,FirstDiaplayedScrollingRowIndex 总是重置为零,所以我必须在刷新之前保存它) 小bug:条件应该是:else if (rowToShow >= firstVisible + countVisible - 1)
(我刚才写了同样的解决方案,因为我错过了这个回复!)【参考方案8】:
请注意,当您的 DataGridView 未启用时设置 FirstDisplayedScrollingRowIndex 会将列表滚动到所需的行,但滚动条不会反映其位置。最简单的解决方案是重新启用和禁用 DGV。
dataGridView1.Enabled = true;
dataGridView1.FirstDisplayedScrollingRowIndex = index;
dataGridView1.Enabled = false;
【讨论】:
【参考方案9】:// 这行得通,它区分大小写并找到第一次出现的搜索
private bool FindInGrid(string search)
bool results = false;
foreach (DataGridViewRow row in dgvData.Rows)
if (row.DataBoundItem != null)
foreach (DataGridViewCell cell in row.Cells)
if (cell.Value.ToString().Contains(search))
dgvData.CurrentCell = cell;
dgvData.FirstDisplayedScrollingRowIndex = cell.RowIndex;
results = true;
break;
if (results == true)
break;
if (results == true)
break;
return results;
【讨论】:
以上是关于如何使 DataGridView 显示选定的行?的主要内容,如果未能解决你的问题,请参考以下文章