Why
- 因为最近在使用
Dev开发的时候,写入日志的时候有时候需要区分说当前的日志等级,例如Info,Error等,我之前的操作都是自定义一个类型然后建立两个数据源然后过滤就是更换绑定源然后刷新,但是这样其实有点浪费资源了,简单但是对于大数据的时候问题很大,所以简单研究了一下自带的过滤器。
How
public class LogInfoData
{
public LogInfoData()
{
if (string.IsNullOrWhiteSpace(ID))
{
ID = Guid.NewGuid().ToString();
}
Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
public string ID { get; set; }
public int Index { get; set; } = 0;
public string Time { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
public string Caption { get; set; }
public string Description { get; set; }
public LogLevel LogLevel { get; set; } = LogLevel.Info;
}
public partial class LogInfoUserControl : XtraUserControl
{
public LogHelper logger => LogHelper.Instance;
public LogInfoUserControl()
{
InitializeComponent();
}
private BindingList<LogInfoData> logInfos = new BindingList<LogInfoData>();
//过滤条件
private List<CriteriaOperator> filters = new List<CriteriaOperator>();
private bool isShowError = false;
private bool isShowWarning = false;
private bool isShowInfo = false;
private void LogInfoUserControl_Load(object sender, EventArgs e)
{
this.gridControl_Log.DataSource = logInfos;
gridView_Main.BestFitColumns();
AddLog("测试", "测试文本", LogLevel.Error);
AddLog("测试1", "测试文本1", LogLevel.Info);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
AddLog("测试2", "测试文本2", LogLevel.Warning);
}
/// <summary>
/// 刷新日志
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void gridView_Main_RowStyle(object sender, RowStyleEventArgs e)
{
if (e.RowHandle < 0)
{
return;
}
var row = e.RowHandle;
var logInfo = gridView_Main.GetRow(e.RowHandle) as LogInfoData;
if (logInfo.LogLevel == LogLevel.Error)
{
e.Appearance.BackColor = Color.Red;
}
else if (logInfo.LogLevel == LogLevel.Warning)
{
e.Appearance.BackColor = Color.Yellow;
}
else if (logInfo.LogLevel == LogLevel.Info)
{
e.Appearance.BackColor = Color.Green;
}
e.HighPriority = true;
}
/// <summary>
/// 构建过滤器
/// </summary>
private void BuildFilter()
{
filters.Clear();
if (isShowError)
{
filters.Add(new BinaryOperator("LogLevel", LogLevel.Error));
}
if (isShowWarning)
{
filters.Add(new BinaryOperator("LogLevel", LogLevel.Warning));
}
if (isShowInfo)
{
filters.Add(new BinaryOperator("LogLevel", LogLevel.Info));
}
if (!filters.Any())
{
gridView_Main.ActiveFilterCriteria = null;
return;
}
gridView_Main.ActiveFilterCriteria = new GroupOperator(GroupOperatorType.Or, filters);
}
/// <summary>
/// 获取日志信息
/// </summary>
/// <param name="caption"></param>
/// <param name="description"></param>
/// <param name="level"></param>
private void AddLog(string caption, string description, LogLevel level)
{
var logInfo = new LogInfoData()
{
LogLevel = level,
Caption = caption,
Description = description,
};
logInfos.Insert(0, logInfo);
}
private void simpleButton_Error_Click(object sender, EventArgs e)
{
isShowError = !isShowError;
simpleButton_Error.Appearance.BackColor = isShowError ? Color.Red : Color.White;
BuildFilter();
}
private void simpleButton_Warnning_Click(object sender, EventArgs e)
{
isShowWarning = !isShowWarning;
simpleButton_Warnning.Appearance.BackColor = isShowWarning ? Color.Yellow : Color.White;
BuildFilter();
}
private void simpleButton_Info_Click(object sender, EventArgs e)
{
isShowInfo = !isShowInfo;
simpleButton_Info.Appearance.BackColor = isShowInfo ? Color.Green : Color.White;
BuildFilter();
}
private void simpleButton_Clear_Click(object sender, EventArgs e)
{
logInfos.Clear();
}
private void simpleButton_Hide_Click(object sender, EventArgs e)
{
logger.Log("Hide", "Hide");
}
}
- 主要是使用
gridView_Main.ActiveFilterCriteria = new GroupOperator(GroupOperatorType.Or, filters);,方法在BuildFilter中对不同的过滤进行组合。
Tips
评论区