wake-up-neo.net

Suchen Sie in dataGridView eine Zeile basierend auf Spalte und Wert

Ich habe ein dataGridView, das 3 Spalten enthält: SystemId, Vorname, Nachname, die mithilfe von Datenbankinformationen gebunden sind. Ich möchte eine bestimmte Zeile hervorheben, die ich verwenden möchte:

dataGridView1.Rows[????].Selected = true;

Die Zeilen-ID weiß ich jedoch nicht, und die Bindungsquelle ändert sich ständig. Daher könnte Zeile 10 in einem Fall "John Smith" sein, aber in einem anderen Fall nicht vorhanden sein (ich habe einen Filter, der die Quelle anhand der Eingaben des Benutzers herausfiltert, also die Eingabe in "joh" würde alle Zeilen ergeben, in denen der Vorname/Nachname "joh" enthält, sodass meine Liste in einem Klick von 50 Namen zu 3 gehen kann. 

Ich möchte einen Weg finden, wie ich eine Zeile basierend auf SystemId und einer entsprechenden Nummer auswählen kann. Ich kann die System-ID mit folgender Methode abrufen:

systemId = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["SystemId"].Value.ToString();

Jetzt muss ich es nur auf die Zeilenauswahl anwenden. So etwas wie dataGridView1.Columns ["SystemId"]. IndexOf (systemId}, aber das funktioniert nicht (noch existiert eine solche Methode). Jede Hilfe wird sehr geschätzt.

48
Lukas

Dadurch erhalten Sie den Rasterview-Zeilenindex für den Wert:

String searchValue = "somestring";
int rowIndex = -1;
foreach(DataGridViewRow row in DataGridView1.Rows)
{
    if(row.Cells[1].Value.ToString().Equals(searchValue))
    {
        rowIndex = row.Index;
        break;
    }
}

Oder eine LINQ-Abfrage

int rowIndex = -1;

        DataGridViewRow row = dgv.Rows
            .Cast<DataGridViewRow>()
            .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue))
            .First();

        rowIndex = row.Index;

dann kannst du tun:

dataGridView1.Rows[rowIndex].Selected = true;
126
Habib

Die obigen Antworten funktionieren nur, wenn AllowUserToAddRows auf false gesetzt ist. Wenn diese Eigenschaft auf true gesetzt ist, erhalten Sie eine NullReferenceException, wenn die Loop- oder Linq-Abfrage versucht, die neue Zeile auszuhandeln. Ich habe die zwei akzeptierten Antworten oben geändert, um AllowUserToAddRows = true zu behandeln.

Schleife Antwort: 

String searchValue = "somestring";
int rowIndex = -1;
foreach(DataGridViewRow row in DataGridView1.Rows)
{
    if (row.Cells["SystemId"].Value != null) // Need to check for null if new row is exposed
    {
        if(row.Cells["SystemId"].Value.ToString().Equals(searchValue))
        {
            rowIndex = row.Index;
            break;
        }
    }
}

LINQ Antwort:

int rowIndex = -1;

bool tempAllowUserToAddRows = dgv.AllowUserToAddRows;

dgv.AllowUserToAddRows = false; // Turn off or .Value below will throw null exception

    DataGridViewRow row = dgv.Rows
        .Cast<DataGridViewRow>()
        .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue))
        .First();

    rowIndex = row.Index;

dgv.AllowUserToAddRows = tempAllowUserToAddRows;
19
jaredbaszler

Oder du kannst so verwenden. Das kann schneller sein.

int iFindNo = 14;
int j = dataGridView1.Rows.Count-1;
int iRowIndex = -1;
for (int i = 0; i < Convert.ToInt32(dataGridView1.Rows.Count/2) +1; i++)
{
    if (Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value) == iFindNo)
    {
        iRowIndex = i;
        break;
    }
    if (Convert.ToInt32(dataGridView1.Rows[j].Cells[0].Value) == iFindNo)
    {
        iRowIndex = j;
        break;
    }
    j--;
}
if (iRowIndex != -1)
    MessageBox.Show("Index is " + iRowIndex.ToString());
else
    MessageBox.Show("Index not found." );
2
user3390902

Versuche dies:

        string searchValue = textBox3.Text;
        int rowIndex = -1;

        dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        try
        {
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (row.Cells["peseneli"].Value.ToString().Equals(searchValue))
                {
                    rowIndex = row.Index;
                    dataGridView1.CurrentCell = dataGridView1.Rows[rowIndex].Cells[0];
                    dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Selected = true;

                    break;
                }
            }
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message);
        }
2

Dies baut auf der obigen Antwort von Gordon auf - nicht alles davon ist meine ursprüngliche Arbeit ... Was ich getan habe, war, eine generischere Methode zu meiner statischen Nutzerklasse hinzuzufügen.

public static int MatchingRowIndex(DataGridView dgv, string columnName, string searchValue)
        {
        int rowIndex = -1;
        bool tempAllowUserToAddRows = dgv.AllowUserToAddRows;

        dgv.AllowUserToAddRows = false; // Turn off or .Value below will throw null exception
        if (dgv.Rows.Count > 0 && dgv.Columns.Count > 0 && dgv.Columns[columnName] != null)
            {
            DataGridViewRow row = dgv.Rows
                .Cast<DataGridViewRow>()
                .FirstOrDefault(r => r.Cells[columnName].Value.ToString().Equals(searchValue));

            rowIndex = row.Index;
            }
        dgv.AllowUserToAddRows = tempAllowUserToAddRows;
        return rowIndex;
        }

Dann rufe ich in beliebiger Form, die ich verwenden möchte, die Methode auf, die DataGridView, den Spaltennamen und den Suchwert übergibt. Der Einfachheit halber konvertiere ich alles in Strings für die Suche, obwohl es leicht genug wäre, Überladungen für die Angabe der Datentypen hinzuzufügen.

private void UndeleteSectionInGrid(string sectionLetter)
        {
        int sectionRowIndex = UtilityMethods.MatchingRowIndex(dgvSections, "SectionLetter", sectionLetter);
        dgvSections.Rows[sectionRowIndex].Cells["DeleteSection"].Value = false;
        }
1
Joey Morgan

Wenn Sie nur prüfen möchten, ob der Artikel vorhanden ist:

IEnumerable<DataGridViewRow> rows = grdPdfs.Rows
            .Cast<DataGridViewRow>()
            .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue));
if (rows.Count() == 0) 
{
    // Not Found
} 
else 
{
    // Found
}
1
Rodrigo Boratto

Diejenigen, dieWPFverwenden

for (int i = 0; i < dataGridName.Items.Count; i++)
{
      string cellValue= ((DataRowView)dataGridName.Items[i]).Row["columnName"].ToString();                
      if (cellValue.Equals("Search_string")) // check the search_string is present in the row of ColumnName
      {
         object item = dataGridName.Items[i];
         dataGridName.SelectedItem = item; // selecting the row of dataGridName
         dataGridName.ScrollIntoView(item);                    
         break;
      }
}

wenn Sie die ausgewählten Zeilenelemente danach abrufen möchten, ist das folgende Code-Snippet hilfreich

DataRowView drv = dataGridName.SelectedItem as DataRowView;
DataRow dr = drv.Row;
string item1= Convert.ToString(dr.ItemArray[0]);// get the first column value from selected row 
string item2= Convert.ToString(dr.ItemArray[1]);// get the second column value from selected row 
0
Deepu Reghunath