2011-12-08 23 views
48

Devo forzare lo DataGridView per mostrare lo row selezionato.Come si fa a rendere DataGridView la riga selezionata?

In breve, ho un textbox che modifica la selezione DGV in base a ciò che viene digitato nello textbox. Quando ciò accade, la selezione cambia in corrispondenza dello row corrispondente.

Purtroppo se il row selezionato è fuori della vista, devo scorrere manualmente verso il basso per trovare la selezione. Qualcuno sa come forzare lo DGV a mostrare lo row selezionato?

Grazie!

+7

Basta impostare la proprietà CurrentCell, il DGV scorrerà per renderlo visibile. –

risposta

86

è possibile impostare:

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

Ecco la MSDN documentation su questa proprietà.

+0

Grazie! Ho lottato con il tentativo di trovare la mia colpa logica nel mio uso di CurrentCell che non funzionava universalmente. Ma posso collegare il numero di riga che ho usato per tutto questo in questo e funziona come un fascino! – clweeks

+0

semplice e perfetto (y) –

10

Basta mettere quella linea dopo la selezione della riga:

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

Perso da un solo minuto! –

32

questo scorre alla riga selezionata senza metterlo in cima.

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

Sicuramente più user-friendly di 'DataGridView.FirstDisplayedScrollingRowIndex', grazie! – Nolonar

+4

A differenza di FirstDisplayedScrollingRowInde, questo sposta anche la freccia della riga sulla riga corretta, seleziona la riga e deseleziona qualsiasi altra riga. – Polyfun

1
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 - selezionati cella deve essere visibile

0

fare qualcosa di simile:

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

funzionerà solo se la prima colonna è visibile. Se è nascosto, otterrai un'eccezione. Questo è più sicuro:

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

Questa procedura consentirà di ripristinare la selezione senza scorrere se la riga di destinazione è già sullo schermo. Conserva anche l'attuale scelta della colonna, che può essere importante nei casi in cui è consentita la modifica in linea.

0

Ho fatto la prossima funzione di ricerca che funziona bene per le selezioni di scorrimento sul 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; 
    } 
} 

}

+0

Questo è quello che uso. – Mac

14

Considerate anche questo codice (usa il da competent_tech modo suggerito):

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

Una risposta molto funzionale ... degna di molti più voti. – ulatekh

+1

Sono d'accordo, quindi l'ho svalutato! Funziona meglio di qualsiasi altra soluzione. – JonP

+2

Funziona alla grande: ho reso rowToShow opptional e l'ho impostato sull'ultima riga se non impostato dal chiamante. Ora scorre verso il basso per impostazione predefinita. Potrebbe aggiungere un'altra firma per dargli un nome migliore. – rheitzman

0

Si prega di notare che l'impostazione FirstDisplayedScrollingRowIndex quando il DataGridView non è abilitato per scorrere l'elenco per riga desiderata, ma la barra di scorrimento non rifletterà la sua posizione. La soluzione più semplice è riabilitare e disabilitare il tuo DGV.

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

// questo funziona, è case sensitive e trova la prima occorrenza di ricerca

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