Мне нужно выбрать всю строку, если ячейка в столбце 0 содержит указанное значение. У меня есть TextBox и DaraGridView. Когда я помещаю значение, которое существует в строке gridview, выбранной без проблем, но когда put не существует в gridview, программа выдает исключение заранее спасибо!!
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;
}
}

[ссылка] ibb.co/fiTGLy
Дополнительная информация: Последовательность не содержит элементов.





The sequence contains no elements
Это говорит мне, что .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;
}
}
генерировать исключение, когда помещаемое значение не существует в gridview «Необработанное исключение типа 'System.NullReferenceException' произошло в WindowsFormsApplication1.exe. Дополнительная информация: ссылка на объект не определена для экземпляра объекта».
@ KAMAL96 На какой строке вы получаете эту ошибку? NullReferenceExceptions легко исправить, если вы знаете, что имеет значение null. Это может быть приведение к струне. Вместо ((string)r.Cells["Column1"].Value).Contains(enteredText) попробуйте r.Cells["Column1"].Value.ToString().Contains(enteredText).
это то же исключение "NullReferenceExceptions"
@ KAMAL96 То же, что и какое исключение? Вы впервые упомянули об исключении NullReferenceException. «Последовательность не содержит элементов» будет InvalidOperationException, а не NullReferenceException.
Непонятно, чего вы здесь пытаетесь достичь. Похоже, это какой-то механизм «фильтра» или «отбора». Что бы вы ни пытались здесь достичь ... похоже, вы делаете это самым трудным способом.
Как другие указывали на эту ошибку… Последовательность не содержит элементов?
В комментариях и ошибке «четко» указано, что вы получаете «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() вернет null, если текст не найден. Это означает, что он не «потерпит неудачу» с «InvalidOperationException», если текст не найден… однако переменная row будет иметь значение null, и код будет «терпеть неудачу» в следующей строке… на этот раз с нулевым значением. исключение указателя, поскольку 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
}
}
}
}
Спасибо !!! когда в gridview есть значение, которое работает без каких-либо проблем, но значение не существует в gridview, возникает исключение System.NullReferenceException.
Вам нужно будет показать код, о котором вы говорите. Код, который я опубликовал, не будет генерировать NullReferrenceException, если значение ячейки равно нулю, потому что код проверяет это в операторе if с row.Cells["Column1"].Value != null
Спасибо, что отлично справились с этим решением, когда я создал новый проект
"выдает исключение" .... как мы могли бы помочь вам, не зная большего? Что такое тип исключения? Что это за сообщение?