using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace JYControl { public enum Logtype//枚举类型 { Message, Warning, Error } public enum LogAddtype//枚举类型 { MES, local, } public partial class LogManagerControl : UserControl { static bool _newErrorInfo = false; static int _ErrorCount = 0; public LogManagerControl() { InitializeComponent(); this.DoubleBuffered = true; this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); this.UpdateStyles(); } private static readonly string logMesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs", "MESLogs"); private static readonly string loglocalPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs", "localLogs"); private static LogManagerControl _manager = new LogManagerControl(); delegate void DoAddMessage(string message, LogAddtype logAddtype, Logtype logType = Logtype.Message); //delegate void DoDelete(); public static void AddLog(string strLog, LogAddtype logAddtype, Logtype logType = Logtype.Message) { if (_manager.listView1.InvokeRequired) { DoAddMessage dam = new DoAddMessage(AddLog); _manager.listView1.Invoke(dam, strLog,logAddtype, logType); } else { string strDate = DateTime.Now.ToString("HH:mm:ss:ff"); ListViewItem item = new ListViewItem(); switch (logType) { case Logtype.Message: if (strLog.Contains("接收到客户端连接") || strLog.Contains("TCP服务器启动监听成功")) { item.ForeColor = Color.White; item.BackColor = Color.SeaGreen; } break; case Logtype.Warning: item.BackColor = Color.Yellow; strLog = "警告:" + strLog; break; case Logtype.Error: item.BackColor = Color.Red; item.ForeColor = Color.White; strLog = "错误:" + strLog; _newErrorInfo = true; _ErrorCount++; break; default: break; } item.Text = strDate; item.SubItems.Add(strLog); _manager.listView1.BeginUpdate(); _manager.listView1.Items.Insert(0, item);//添加在第一行 //_manager.listView1.Items.Add(item);//添加在最后一行 int ff = _manager.listView1.Items.Count - 1; if (_manager.listView1.Items.Count > 150) { _manager.listView1.Items.RemoveAt(ff); } //_manager.listView1.Items[_manager.listView1.Items.Count - 1].EnsureVisible(); _manager.listView1.EndUpdate(); string fileName = $"{DateTime.Now.ToString("yyyyMMdd")}.txt"; switch (logAddtype) { case LogAddtype.MES: if (!Directory.Exists(logMesPath)) { Directory.CreateDirectory(logMesPath); } string logMesFilePath = Path.Combine(logMesPath, fileName); using (StreamWriter sw = new StreamWriter(logMesFilePath, true)) { sw.WriteLine(strDate + " " + logType.ToString() + " " + strLog); } break; case LogAddtype.local: if (!Directory.Exists(loglocalPath)) { Directory.CreateDirectory(loglocalPath); } string loglocalFilePath = Path.Combine(loglocalPath, fileName); using (StreamWriter sw = new StreamWriter(loglocalFilePath, true)) { sw.WriteLine(strDate + " " + logType.ToString() + " " + strLog); } break; default: break; } //添加日志到log文件中 } } public static void ClearLog() { //if (_manager.listView1.InvokeRequired) //{ // DoDelete dam = new DoDelete(ClearLog); // _manager.listView1.Invoke(dam); //} //else //{ //if (_manager.listView1.Items.Count > 200) //{ // _manager.listView1.Items.RemoveAt(item); //} _manager.listView1.Items.Clear(); //} } /// /// 双缓冲ListView ,解决闪烁 /// public class DoubleBufferListView : System.Windows.Forms.ListView { public DoubleBufferListView() { SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); UpdateStyles(); } } protected override void WndProc(ref Message m) { if (m.Msg == 0x0014) // 禁掉清除背景消息 return; base.WndProc(ref m); } public static bool HasNewErrorInfo { get { return _newErrorInfo; } set { _newErrorInfo = value; } } public static int ErrorInfoCount { get { return _ErrorCount; } set { _ErrorCount = 0; } } public static LogManagerControl Manager { get { return LogManagerControl._manager; } set { LogManagerControl._manager = value; } } } }