Znajdź wiersz w dataGridView na podstawie kolumny i wartości

Mam dataGridView, który ma 3 kolumny: SystemId, FirstName, LastName, który jest związany za pomocą informacji bazy danych. Chciałbym wyróżnić pewien wiersz, który zrobiłbym używając:

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

Row ID ja jednak nie wiem i bindingsource ciągle się zmienia, więc wiersz 10 może być "John Smith" w jednym przypadku, ale nawet nie istnieje w innym (mam filtr, który odfiltrowuje źródło na podstawie tego, co wprowadza użytkownik, więc wpisanie " joh " daje wszystkie wiersze, w których imię / nazwisko ma "joh" w nich, stąd moja lista może przejść od 50 nazwisk do 3 jednym kliknięciem).

Chcę znaleźć sposób na wybranie wiersza na podstawie identyfikatora systemowego i odpowiadającej mu liczby. Mogę uzyskać identyfikator systemu za pomocą następującej metody:

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

Teraz wystarczy zastosować go do selektora wierszy. Coś jak dataGridView1.Kolumny ["SystemId"].IndexOf (systemId} ale to nie działa (ani taka metoda nie istnieje). Każda pomoc jest bardzo mile widziana.

Author: default locale, 2012-04-16

7 answers

To da ci indeks wiersza gridview dla wartości:

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

Lub zapytanie LINQ

int rowIndex = -1;

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

        rowIndex = row.Index;

Wtedy możesz zrobić:

dataGridView1.Rows[rowIndex].Selected = true;
 122
Author: Habib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-16 18:07:58

Powyższe odpowiedzi działają tylko wtedy, gdy {[2] } jest ustawione na false. Jeśli ta właściwość jest ustawiona na true, wtedy otrzymasz NullReferenceException, gdy zapytanie loop lub Linq spróbuje wynegocjować nowy wiersz. Zmodyfikowałem dwie zaakceptowane odpowiedzi powyżej, aby obsłużyć AllowUserToAddRows = true.

Odpowiedź pętli:

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;
        }
    }
}
Odpowiedź LINQ:
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;
 18
Author: jaredbaszler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 08:35:56

Lub możesz użyć w ten sposób. To może być szybsze.

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
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-07 04:35:57

Spróbuj tego:

        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
Author: vahid ghezelvand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-05 12:09:29

Jeśli chcesz tylko sprawdzić, czy ten element istnieje:

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
Author: Rodrigo Boratto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 17:39:03

To opiera się na powyższej odpowiedzi Gordona-nie wszystko jest moim oryginalnym dziełem. To, co zrobiłem, to dodanie bardziej ogólnej metody do mojej statycznej klasy użyteczności.

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

Następnie w dowolnej formie, jaką chcę z niej skorzystać, wywołuję metodę przekazującą DataGridView, nazwę kolumny i wartość wyszukiwania. Dla uproszczenia konwertuję wszystko na ciągi do wyszukiwania, chociaż łatwo byłoby dodać przeciążenia do określania typów danych.

private void UndeleteSectionInGrid(string sectionLetter)
        {
        int sectionRowIndex = UtilityMethods.MatchingRowIndex(dgvSections, "SectionLetter", sectionLetter);
        dgvSections.Rows[sectionRowIndex].Cells["DeleteSection"].Value = false;
        }
 1
Author: Joey Morgan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-08 14:57:00

Ci, którzy używają WPF

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

Jeśli chcesz uzyskać zaznaczone elementy wiersza po tym, urywek kodu follwing jest pomocny

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
Author: Deepu Reghunath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-11 07:06:03