[英]how to select datagridview row programmatically in c#
如果第 0 列中的單元格包含指定值,我需要選擇整行。 我有一個 TextBox 和 DaraGridView。當我在 gridview 行中選擇存在的值時沒有問題但是當 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;
}
}
該序列不包含任何元素
這告訴我.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;
}
}
目前尚不清楚您要在這里完成什么。 它似乎是某種“過濾器”或“選擇”機制。 無論你想在這里完成什么……看起來你是在以最困難的方式去做這件事。
正如其他人指出的這個錯誤...... 序列不包含元素?
注釋和錯誤“清楚地”指出,您收到了“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
將為空,並且代碼將在下一行強制“失敗”……這次是空因為指針異常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
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.