我正在尝试编写一个程序,该程序将根据文本文件生成datagridview。请参阅下面的代码。
private void Button1_Click(object sender, EventArgs e)
{
ls_datenTabelle.Clear();
ls_datenTabelle.Columns.Clear();
string kdstr = (comboBox1.SelectedItem.ToString());
string fileName = "ls.txt";
string fileName2 = kdstr + ".txt";
string sourcePath = @"H:\import_directoy\customer\" + kdstr;
string tempPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string dmitempPath = @"program_name\";
string targetPath = Path.Combine(tempPath, dmitempPath);
File.Delete(targetPath + "output");
string sourceFileName = Path.Combine(sourcePath, fileName);
string destFile = Path.Combine(targetPath, fileName2);
Directory.CreateDirectory(targetPath);
File.Copy(sourceFileName, destFile, overwrite: true);
using (var output = File.Create(targetPath + "output"))
{
foreach (var file in new[] { "H:\\directoy1\\directoy2\\index.config", destFile })
{
using (var input = File.OpenRead(file))
{
input.CopyTo(output);
}
}
}
string[] raw_text = File.ReadAllLines(targetPath + "output", Encoding.Default);
string[] data_col = null;
int x = 0;
foreach (string text_line in raw_text)
{
data_col = text_line.Split(';');
if (x == 0)
{
for (int i = 0; i <= data_col.Count() - 1; i++)
{
ls_datenTabelle.Columns.Add(data_col[i]);
}
x++;
}
else
{
ls_datenTabelle.Rows.Add(data_col);
}
}
ls_dataGridView.DataSource = ls_datenTabelle;
this.Controls.Add(ls_dataGridView);
ls_dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
ls_dataGridView.AllowUserToAddRows = false;
}
现在我想遍历这个数据表/ datagridview,如果搜索功能在任何列中找到了searchvalue,我会显示行。
但我知道怎么做。表格的标题可能每天都在变化。所以这段代码对我不起作用:
public void findingValue(object sender, EventArgs e)
{
string searchValue = textBox1.Text;
DataView data = ls_datenTabelle.DefaultView;
ls_dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
data.RowFilter = string.Format("Name like '" + searchValue + "%'");
}
程序将只找到searchValue位于&#34; Name&#34;列,而不是其他18个(未知)列之一。
答案 0 :(得分:0)
这是一个使用Linq循环遍历DataTable中的列的示例:
if (searchValue == "") data.RowFilter = "";
else
{
var cols = ls_datenTabelle.Columns.Cast<DataColumn>().Select(x => x.ColumnName);
var filter = cols.Select(x => x + " like '" + searchValue + "%'")
.Aggregate((a, b) => a + " OR " + b);
data.RowFilter = filter;
}
首先我们收集列名,然后我们从它们构建一个过滤器,每个部分都连接一个OR
子句。
你也可以使用Join
或旧的循环..
请注意,这假设所有列都允许搜索字符串,即没有数字等。
如果不是这样,你会想要只选择字符串列或更改非字符串列的过滤器,如果搜索它们是有意义的。
要将搜索限制为字符串列,只需插入
即可.Where(x => x.DataType == typeof(string))
在Cast
和Select
之间,以便cols
仅包含可搜索的列..
如果您想要搜索数字列,可以像这样编写过滤器:
var filter = cols.Select(x => "Convert(" + x + ", 'System.String') like '"
+ searchValue + "%'").Aggregate((a, b) => a + " OR " + b);
这使用expression syntax的Convert
功能。但是为什么要搜索以某些数字开头的数字呢?
这是一个包含2个字符串,1个数字和1个日期时间列的测试。过滤器适用于所有人;请注意,对于测试我添加了额外的&#39;%&#39;将搜索范围扩展到整个值,而不仅仅是开始......