在DataGridView中的任何位置搜索

时间:2018-04-19 10:19:58

标签: c# winforms search filter datagridview

我正在尝试编写一个程序,该程序将根据文本文件生成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个(未知)列之一。

1 个答案:

答案 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))

CastSelect之间,以便cols仅包含可搜索的列..

如果您想要搜索数字列,可以像这样编写过滤器:

var filter = cols.Select(x => "Convert(" + x + ", 'System.String')  like '" 
                            + searchValue + "%'").Aggregate((a, b) => a + " OR " + b);

这使用expression syntaxConvert功能。但是为什么要搜索以某些数字开头的数字呢?

这是一个包含2个字符串,1个数字和1个日期时间列的测试。过滤器适用于所有人;请注意,对于测试我添加了额外的&#39;%&#39;将搜索范围扩展到整个值,而不仅仅是开始......

enter image description here