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.
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;
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;
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." );
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);
}
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
}
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;
}
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
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