在数据表中搜索

时间:2017-07-19 15:06:53

标签: c# datagridview filter datatable

我目前正在开发一个处理文件并创建数据的项目,并为处理结果创建一个“excel”外观数据网格视图。 该流程将打开一个新文件并单击该过程。之后,datagridview将显示包含已处理数据的表。以下是创建表并输入每列值的函数。

public DataTable createDataTable()
    {
        DataTable dt = new DataTable();

        dt.Columns.Add("Date Time");
        dt.Columns.Add("CAT Protocol");
        dt.Columns.Add("Display");
        //dt.Columns.Add("Command ID");
        dt.Columns.Add("Command Description");

        List<string> timeList = time();
        List<string> catList = read(userSelectedFilePath);
        List<string> displayList = translate(catList);
        List<string> idList = commandID(catList);
        List<string> descList = commandDescription(idList);


        int rows = catList.Count();

        for (int i = 0; i < rows; i++)
        {
            DataRow _myRow = dt.NewRow();
            _myRow["Date Time"] = timeList.ElementAt(i);
            _myRow["CAT Protocol"] = catList.ElementAt(i);
            _myRow["Display"] = displayList.ElementAt(i);
            //_myRow["Command ID"] = idList.ElementAt(i);
            _myRow["Command Description"] = descList.ElementAt(i);
            dt.Rows.Add(_myRow);
        }

        return dt;
    }

然后用户可以使用“查找”功能,该功能将根据用户的输入刷新结果。当用户选择“查找”时,将弹出一个文本框。当用户按Enter键时,将根据命令描述刷新数据表。 我想我需要在这个函数中编写一些代码。

 private void TextBoxKeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            //write something here
        }
    }

这是我界面的截图。 enter image description here 我的问题是如何在这个应用程序中实现查找功能。我会非常感谢各种帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用LINQ获取相应行的所有索引:

var indices = descList.Select((desc, index) => new { desc, index = index }).Where(item => item .desc.Contains(SearchTextBox.Text)).Select(item => item.index).ToList();

然后清除你的DataGridView并读取所有带有索引的项目,你得到。

for (int i = 0; i < indices.Count; i++)
{
    DataRow _myRow = dt.NewRow();
    _myRow["Date Time"] = timeList.ElementAt(indices[i]);
    _myRow["CAT Protocol"] = catList.ElementAt(indices[i]);
    _myRow["Display"] = displayList.ElementAt(indices[i]);
    //_myRow["Command ID"] = idList.ElementAt(indices[i]);
    _myRow["Command Description"] = descList.ElementAt(indices[i]);
    dt.Rows.Add(_myRow);
}

此外,我建议你为每一行构建一个类:

public class LogLine{
    public DateTime Date {get;set;} //maybe Convert to DateTime or change to string
    public string Protocol {get;set;}
    public string Display {get;set;}
    public string Command {get;set;}
}

稍后,您只需使用List<LogLine>填充DataGridView

这将使您的代码更清晰,并将简化大部分代码。