web-dev-qa-db-fra.com

Comment faire en sorte que DataGridView affiche la ligne sélectionnée?

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!

67
kereberos

Vous pouvez définir:

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

Voici le documentation MSDN sur cette propriété.

116
competent_tech

Celui-ci fait défiler jusqu'à la ligne sélectionnée sans la placer en haut.

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

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

Il suffit de mettre cette ligne après la sélection de la ligne:

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

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;
1
user3175253
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

1
Dobry

// 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;
    }
1
Mac

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.

0
sgriffin

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

}

0
Dappertje