【问题标题】:Search anywhere in DataGridView在 DataGridView 中的任意位置搜索
【发布时间】:2023-03-16 08:54:01
【问题描述】:

我正在尝试编写一个基于文本文件制作数据网格视图的程序。请参阅下面的代码。

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;
}

现在我想搜索整个数据表/数据网格视图,如果搜索功能在任何列中找到搜索值,我将显示行。

但我不知道怎么做。表格的标题可能每天都在变化。所以这段代码对我不起作用:

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 在“名称”列中的行,而不是其他 18 个(未知)列之一。

【问题讨论】:

  • 遍历列并构建更复杂的过滤器!

标签: c# winforms search filter datagridview


【解决方案1】:

这是一个使用 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 个日期时间列的测试。过滤器适用于所有人;请注意,对于测试,我添加了一个额外的 '%' 以将搜索扩展到整个值,而不仅仅是开始..

【讨论】:

  • 我得到一个错误:(“令牌''System.String''不能被解释为位置19。”
  • 我的dataTable的结构可能有点棘手。我有数字、日期和文本。
  • 这应该不是问题。此处的代码适用于所有这些类型。
  • 我收到这条消息:(对不起,我是德国人,所以语言也是德语;))
  • 如果表格标题中有 -. 则不起作用。我太傻了 :( | @TaW 非常感谢。你拯救了我的一周和周末。
猜你喜欢
  • 2019-05-27
  • 1970-01-01
  • 2011-12-01
  • 2016-03-31
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2022-01-07
  • 2012-10-21
相关资源
最近更新 更多