c# winforms datagridview scroll selected

c# - ¿Cómo hago para que DataGridView muestre la fila seleccionada?



winforms scroll (9)

Necesito forzar que DataGridView muestre la row seleccionada.

En resumen, tengo un textbox que cambia la selección de DGV función de lo que se escribe en el textbox . Cuando esto sucede, la selección cambia a la row correspondiente.

Lamentablemente, si la row seleccionada está fuera de la vista, tengo que desplazarme manualmente hacia abajo para encontrar la selección. ¿Alguien sabe cómo forzar a la DGV a mostrar la row seleccionada?

¡Gracias!


Éste se desplaza a la fila seleccionada sin ponerlo en la parte superior.

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


// Esto funciona, es sensible a mayúsculas y encuentra la primera aparición de búsqueda

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


Considere también este código (utiliza la forma sugerida de competent_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; } } }


Haciendo algo como esto:

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

solo funcionará si la primera columna está visible. Si está oculto, obtendrá una excepción. Esto es más seguro:

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

Esto restablecerá la selección sin desplazarse si la fila de destino ya está en la pantalla. También conserva la opción de columna actual que puede importar en los casos en que haya permitido la edición en línea.


Hice la siguiente función de búsqueda que funciona bien para desplazar selecciones en la pantalla.

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

}


Puedes configurar:

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

Aquí está la documentación de MSDN en esta propiedad.


Simplemente ponga esa línea después de seleccionar la fila:

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


Tenga en cuenta que configurar FirstDisplayedScrollingRowIndex cuando su DataGridView no esté habilitado desplazará la lista a la fila deseada, pero la barra de desplazamiento no reflejará su posición. La solución más simple es volver a habilitar y deshabilitar su DGV.

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


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 - la celda seleccionada debe estar visible