Wie kann ich in DataGridView die ausgewählte Zeile anzeigen lassen?

77

Ich muss das erzwingen DataGridView, um das Ausgewählte anzuzeigen row.

Kurz gesagt, ich habe eine textbox, die die DGVAuswahl basierend auf dem, was in die eingegeben wird , ändert textbox. In diesem Fall ändert sich die Auswahl in die Übereinstimmung row.

Wenn die Auswahl rownicht angezeigt wird, muss ich leider manuell nach unten scrollen, um die Auswahl zu finden. Weiß jemand, wie man das erzwingt DGV, um das Ausgewählte anzuzeigen row?

Vielen Dank!

Kereberos
quelle
9
Legen Sie einfach die CurrentCell-Eigenschaft fest. Der DGV scrollt, um sie sichtbar zu machen.
Hans Passant

Antworten:

133

Sie können einstellen:

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

Hier ist die MSDN-Dokumentation zu dieser Eigenschaft.

kompetent_tech
quelle
Vielen Dank! Ich habe Probleme damit, meinen logischen Fehler bei der Verwendung von CurrentCell zu finden, die nicht universell funktioniert. Aber ich kann die Zeilennummer, die ich die ganze Zeit benutzt habe, in diese einstecken und es funktioniert wie ein Zauber!
Wochen
einfach und perfekt (y)
ahmed abdelqader
50

Dieser scrollt zur ausgewählten Zeile, ohne sie oben zu platzieren.

dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];
IgorOliveira
quelle
3
Auf jeden Fall benutzerfreundlicher als DataGridView.FirstDisplayedScrollingRowIndex, danke!
Nolonar
6
Im Gegensatz zu FirstDisplayedScrollingRowInde wird hiermit auch der Zeilenpfeil in die richtige Zeile verschoben, die Zeile ausgewählt und die Auswahl einer anderen Zeile aufgehoben.
Polyfun
dataGridView1.CurrentCell = dataGridView1.SelectedRows[0].Cells[0]
Mahmoodvcs
1
Wenn jedoch die erste Spalte ausgeblendet wurde, wird dies eine Ausnahme auslösen.
Griff
27

Berücksichtigen Sie auch diesen Code (verwendet den von kompetenten_Technologie vorgeschlagenen Weg):

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;
        }
    }
}
Georg
quelle
3
Eine sehr funktionale Antwort ... die weit mehr Stimmen verdient.
ulatekh
1
Ich stimme zu, also habe ich es positiv bewertet! Es funktioniert besser als alle anderen Lösungen.
JonP
3
Funktioniert hervorragend - Ich habe rowToShow optional gemacht und auf die letzte Zeile gesetzt, wenn dies nicht vom Anrufer festgelegt wurde. Jetzt wird standardmäßig nach unten gescrollt. Könnte eine weitere Signatur hinzufügen, um einen besseren Namen zu erhalten.
Rheitzman
1
Vielen Dank. Dies funktioniert viel besser als andere Antworten. Tipp für andere Benutzer: Ich habe es ein wenig geändert, um firstVisible zu übergeben, da meine Liste ebenfalls aktualisiert wurde, bevor ich EnsureVisibleRow aufrufen musste (nach dem Aktualisieren des DataGridView-Inhalts wurde FirstDiaplayedScrollingRowIndex immer auf Null zurückgesetzt, sodass ich sie vor der Aktualisierung speichern musste).
Brian O Carroll
Kleiner Fehler: Die Bedingung sollte sein: else if (rowToShow >= firstVisible + countVisible - 1)(Ich habe gerade die gleiche Lösung geschrieben, weil ich diese Antwort verpasst habe!)
PW
11

Fügen Sie einfach diese Zeile nach der Auswahl der Zeile ein:

dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;
Fischermaen
quelle
1
Verpasste es um eine Minute!
Alex Jorgenson
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 - Die ausgewählte Zelle muss sichtbar sein

Dobry
quelle
1

Beachten Sie, dass beim Festlegen von FirstDisplayedScrollingRowIndex, wenn Ihre DataGridView nicht aktiviert ist, die Liste zur gewünschten Zeile gescrollt wird, die Bildlaufleiste jedoch nicht deren Position widerspiegelt. Die einfachste Lösung ist das erneute Aktivieren und Deaktivieren Ihres DGV.

dataGridView1.Enabled = true;
dataGridView1.FirstDisplayedScrollingRowIndex = index;
dataGridView1.Enabled = false;
user3175253
quelle
1

// Dies funktioniert, unterscheidet zwischen Groß- und Kleinschreibung und findet das erste Auftreten der Suche

    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;
    }
Mac
quelle
0

So etwas machen:

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

funktioniert nur, wenn die erste Spalte sichtbar ist. Wenn es ausgeblendet ist, erhalten Sie eine Ausnahme. Das ist sicherer:

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

Dadurch wird die Auswahl ohne Scrollen zurückgesetzt, wenn die Zielzeile bereits auf dem Bildschirm angezeigt wird. Außerdem wird die aktuelle Spaltenauswahl beibehalten, die in Fällen von Bedeutung sein kann, in denen Sie die Inline-Bearbeitung zugelassen haben.

sgriffin
quelle
0

Ich habe die nächste Suchfunktion gemacht, die gut zum Scrollen von Auswahlen in der Anzeige funktioniert.

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

}}

Dappertje
quelle
Dies ist die, die ich benutze.
Mac