Je dois forcer le DataGridView
pour afficher le row
sélectionné.
En bref, j'ai un textbox
qui modifie la sélection DGV
en fonction de ce qui est saisi dans le textbox
. Lorsque cela se produit, la sélection passe à la correspondance row
.
Malheureusement, si le row
sélectionné est hors de la vue, je dois faire défiler manuellement pour trouver la sélection. Est-ce que quelqu'un sait comment forcer le DGV
à afficher le row
sélectionné?
Merci!
Vous pouvez définir:
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;
Voici le documentation MSDN sur cette propriété.
Celui-ci fait défiler jusqu'à la ligne sélectionnée sans la placer en haut.
dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];
Considérez également ce code (utilise la méthode suggérée par 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;
}
}
}
Il suffit de mettre cette ligne après la sélection de la ligne:
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;
Veuillez noter que le réglage FirstDisplayedScrollingRowIndex lorsque votre DataGridView n'est pas activé fait défiler la liste jusqu'à la ligne souhaitée, mais que la barre de défilement ne reflète pas sa position. La solution la plus simple est la réactivation et la désactivation de votre 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 cellule sélectionnée doit être visible
// Cela fonctionne, il est sensible à la casse et trouve la première occurrence de la recherche
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;
}
Faire quelque chose comme ça:
dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];
ne fonctionnera que si la première colonne est visible. Si c'est caché, vous aurez une exception. C'est plus sûr:
var column = dataGridView1.CurrentCell != null ? dataGridView1.CurrentCell.ColumnIndex : dataGridView1.FirstDisplayedScrollingColumnIndex; dataGridView1.CurrentCell = dataGridView1.Rows[iNextHighlight].Cells[column];
Cela réinitialisera la sélection sans défilement si la ligne cible est déjà à l'écran. Cela préserve également le choix de la colonne en cours, ce qui peut être important dans les cas où vous avez autorisé la modification en ligne.
J'ai fait la fonction de recherche suivante qui fonctionne bien pour faire défiler les sélections dans l'affichage.
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;
}
}
}