Как выбрать строку просмотра данных программно в C#
Мне нужно выбрать всю строку, если ячейка в столбце 0 содержит указанное значение. У меня есть TextBox и DaraGridView.when я помещаю значение, существующее в строке сетки, выбранной без проблем. Но когда пут не существует в таблице, программа выдает исключение, спасибо заранее!
private void Searchvalue_TextChanged(object sender, EventArgs e)
{
dataGridView1.ClearSelection();
var enteredText = (sender as TextBox).Text;
int rowIndex = -1;
bool tempAllowUserToAddRows = dataGridView1.AllowUserToAddRows;
// Turn off or .Value below will throw null exception
dataGridView1.AllowUserToAddRows = false;
if (enteredText != String.Empty)
{
DataGridViewRow row = dataGridView1.Rows
.Cast<DataGridViewRow>()
.Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).First();
rowIndex = row.Index;
dataGridView1.AllowUserToAddRows = tempAllowUserToAddRows;
dataGridView1.Rows[rowIndex].Selected = true;
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows[rowIndex].Index;
}
}
2 ответа
Неясно, что вы пытаетесь достичь здесь. Похоже, это какой-то механизм "фильтра" или "выбора". Все, что вы пытаетесь сделать здесь... кажется, вы идете по этому пути самым сложным способом.
Как другие указали на эту ошибку... Последовательность не содержит элементов?
В комментариях и ошибке "ясно" говорится, что вы получаете "InvalidOperationException". Я не эксперт по LINQ, поэтому, я предполагаю, что когда вы используете следующую команду...
Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).First();
Если enteredText
НЕ найдено... что есть .First()
собираешься вернуться? Это может быть причиной вашей ошибки. Замена этого хорошо прокомментированного решения ниже может решить проблему "этой".
Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).FirstOrDefault();
FirstOrDefault()
вернет ноль, если текст не найден. Это означает, что он не "потерпит неудачу" с "InvalidOperationException", когда текст не найден... однако, переменная row
будет нулевым, и код будет обязательным "провал" на следующей строке... на этот раз с исключением нулевого указателя, так как row
будет нулевым, если текст не найден.
Не зная, что вы пытаетесь сделать в общей перспективе, я могу только порекомендовать вам использовать какую-то "коллекцию" для хранения данных в сетке, большинство из них DataSources
встроенные механизмы, помогающие выполнять такие действия, как поиск / сортировка и т. д. Очевидно, что вам потребуется больше усилий для самостоятельного управления данными сетки.
Без использования источника данных приведенный ниже код должен выполнять то, что вы описываете.
private void Searchvalue_TextChanged(object sender, EventArgs e) {
dataGridView1.ClearSelection();
var targetText = Searchvalue.Text;
if (targetText != String.Empty) {
foreach (DataGridViewRow row in dataGridView1.Rows) {
if (!row.IsNewRow && row.Cells["Column1"].Value != null && row.Cells["Column1"].Value.ToString().Contains(targetText)) {
row.Selected = true;
dataGridView1.FirstDisplayedScrollingRowIndex = row.Index;
break; // remove this if you want to select all the rows that contain the text
}
}
}
}
Последовательность не содержит элементов
Это говорит мне, что .First()
не работает в приведенном ниже коде.
if (enteredText != String.Empty)
{
DataGridViewRow row = dataGridView1.Rows
.Cast<DataGridViewRow>()
.Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText))
.First();
rowIndex = row.Index;
dataGridView1.Rows[rowIndex].Selected = true;
}
Измените это на это, чтобы избежать исключения (изменились и другие мелочи).
if (!string.IsNullOrEmpty(enteredText))
{
var row = dataGridView1.Rows
.Cast<DataGridViewRow>()
.FirstOrDefault(r => ((string)r.Cells["Column1"].Value).Contains(enteredText));
if (row != null)
{
row.Selected = true;
}
}
Кроме того, если вы хотите выбрать все строки, которые содержат текст...
if (!string.IsNullOrEmpty(enteredText))
{
var rows = dataGridView1.Rows
.Cast<DataGridViewRow>()
.Where(r => ((string)r.Cells["Column1"].Value).Contains(enteredText));
foreach (var row in rows)
{
row.Selected = true;
}
}