如何在 C# 中以编程方式 select datagridview 行
how to select datagridview row programmatically in c#
如果第 0 列中的单元格包含指定值,我需要 select 整行。我有一个 TextBox 和 DaraGridView.when 我把一个值存在于 gridview 行 selected 没有问题但是当 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;
}
}
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;
}
}
或者,如果您想要 select 所有包含文本的行...
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;
}
}
不清楚您要在这里完成什么。它似乎是某种“过滤器”或“选择”机制。无论你在这里试图完成什么......看起来你正在以最困难的方式解决这个问题。
正如其他人指出的这个错误……Sequence contains no elements?
评论和错误“明确”指出,您收到“InvalidOperationException”。因此,我不是 LINQ 专家,我猜测当您使用以下命令时……
Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).First();
如果 enteredText
没有找到…….First()
会去 return 做什么?这可能是您错误的原因。用下面评论良好的解决方案替换它可能会解决“这个”问题。
Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).FirstOrDefault();
如果找不到文本,FirstOrDefault()
将 return 为空。这意味着当找不到文本时,它不会因“InvalidOperationException”而“失败”……但是,变量 row
将为空,并且代码将在下一行强制“失败”……这出现空指针异常的时间,因为如果找不到文本,row
将为空。
在不知道您从整体角度想做什么的情况下,我只能强烈建议您使用某种“集合”将数据存储在网格中,其中大部分 DataSources
已经内置在做 searching/sorting 等事情时提供帮助的机制......显然需要您做更多的工作来自己管理网格数据。
在不使用数据源的情况下,下面的代码应该可以完成您所描述的内容。
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
}
}
}
}
如果第 0 列中的单元格包含指定值,我需要 select 整行。我有一个 TextBox 和 DaraGridView.when 我把一个值存在于 gridview 行 selected 没有问题但是当 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;
}
}
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;
}
}
或者,如果您想要 select 所有包含文本的行...
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;
}
}
不清楚您要在这里完成什么。它似乎是某种“过滤器”或“选择”机制。无论你在这里试图完成什么......看起来你正在以最困难的方式解决这个问题。
正如其他人指出的这个错误……Sequence contains no elements?
评论和错误“明确”指出,您收到“InvalidOperationException”。因此,我不是 LINQ 专家,我猜测当您使用以下命令时……
Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).First();
如果 enteredText
没有找到…….First()
会去 return 做什么?这可能是您错误的原因。用下面评论良好的解决方案替换它可能会解决“这个”问题。
Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).FirstOrDefault();
如果找不到文本,FirstOrDefault()
将 return 为空。这意味着当找不到文本时,它不会因“InvalidOperationException”而“失败”……但是,变量 row
将为空,并且代码将在下一行强制“失败”……这出现空指针异常的时间,因为如果找不到文本,row
将为空。
在不知道您从整体角度想做什么的情况下,我只能强烈建议您使用某种“集合”将数据存储在网格中,其中大部分 DataSources
已经内置在做 searching/sorting 等事情时提供帮助的机制......显然需要您做更多的工作来自己管理网格数据。
在不使用数据源的情况下,下面的代码应该可以完成您所描述的内容。
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
}
}
}
}