根据用户输入动态筛选显示的文本

本文关键字:显示 文本 筛选 动态 用户 输入 | 更新日期: 2023-09-27 18:00:42

我正在尝试制作一个工具来获取一个格式化的文本文件,该文件存储我们的日志信息,并只返回其中的某些部分。例如,日志文件看起来像这样:

[TimeStamp] <Config>: Configuration note is shown here
[TimeStamp] <Info>: Information is written here   
[TimeStamp] <Info>: More Information
[TimeStamp] <Step>: A generated step is writing a message
[TimeStamp] <Warning>: A warning is logged
[TimeStamp] <Error>: An error has occurred

我想从文件中获取这些文本,并根据尖括号中每个日志消息类型的复选框,用户可以隐藏他们不想看到的内容。例如取消选中"步骤"复选框会隐藏"步骤"行,但如果他们重新检查,它会重新出现在文本窗口中。

我尝试将每一行存储到一个字符串中,该字符串存储在一个列表中,以保持每一行的顺序,但是这种方法在更改文本方面非常非常慢。方法如下所示

logTextbox.Text = "";
foreach (string line in CompleteLog) //CompleteLog is list containing each line in log file
{
   if (CheckLine(line)) //Checks line based on what the user wants to see
   {
      WriteLine(line);
   }
}

任何建议都非常欢迎

编辑:

        private bool CheckLine(string line)
    {
        int left = line.IndexOf('<');
        int right = line.IndexOf(">:");
        string logtype = line.Substring(left+1, right - left-1);
        if (ValidLogs.Any(p => p.ToLower().Equals(logtype.ToLower())))
        {
            return true;
        }
        return false;
    }

ValidLogs是一个字符串列表,其中包含在加载时允许设置的内容,以及在与日志类型对应的复选框的检查事件中更改的内容。上面的第一种方法用于加载和每个检查事件,以更新显示的内容。

根据用户输入动态筛选显示的文本

我认为实现这一点的最佳方法是使用listview控件。您可以在文本文件中每行添加一个项目,然后根据复选框筛选显示的项目(行)。我可以推荐ObjectListView作为实现这一点并使其看起来美观的一种方法吗。

假设你没有内存限制或过大的文件,并且你的过滤条件是固定的,你可以预先解析过滤条件的每一行,并将过滤细节存储在一个日志对象上,然后你就可以检查具有简单属性的对象,而不是每次都重新解析。

public class LogLine {
       public string Text { get; set; }
       public eLogLevel LogLevel { get; set; }
       // other filter properties
}

然后,您可以更改CheckLines()以筛选LogLine对象的列表。

logTextbox.Text = "";
foreach (LogLine line in ParsedLog) //ParsedLog is list containing each line in log file pre-parsed
{
   if (CheckLine(line)) //Checks line based on what the user wants to see
   {
      WriteLine(line.Text);
   }
}