如何使 DataGridView 显示选定的行?

我需要强制 DataGridView显示选定的 row

简而言之,我有一个 textbox,它可以根据输入到 textbox的内容改变 DGV的选择。当这种情况发生时,选择更改为匹配的 row

不幸的是,如果选定的 row不在视图中,我必须手动向下滚动才能找到选定内容。是否有人知道如何强制 DGV显示选定的 row

谢谢!

114699 次浏览

You can set:

dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;

Here is the MSDN documentation on this property.

Just put that line after the selecting the row:

dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;

This one scrolls to the selected row without put it on top.

dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];
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 - selected cell must be visible

Doing something like this:

dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];

will only work if the first column is visible. If it is hidden, you'll get an exception. This is safer:

var column = dataGridView1.CurrentCell != null ? dataGridView1.CurrentCell.ColumnIndex : dataGridView1.FirstDisplayedScrollingColumnIndex; dataGridView1.CurrentCell = dataGridView1.Rows[iNextHighlight].Cells[column];

This will reset the selection without scrolling if the target row is already on screen. It also preserves the current column choice which can matter in cases where you've allowed inline editing.

I made the next search function it works wel for scrolling selections in display.

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;
}
}

}

Consider also this code (uses the from competent_tech suggested way):

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;
}
}
}

Please note that setting FirstDisplayedScrollingRowIndex when your DataGridView is not enabled will scroll the list to desired row, but scrollbar will not reflect its position. Simpliest solution is re-enabling and disabling your DGV.

dataGridView1.Enabled = true;
dataGridView1.FirstDisplayedScrollingRowIndex = index;
dataGridView1.Enabled = false;

// This works, it's case sensitive and finds the first occurrence of search

    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;
}