winform
在windows form开发过程中还是有很多坑需要注意,包括一些重要代码记不得,在这个文件中进行汇总更新。
命名规则
- M结尾表示model
- A结尾表示消息
- Object表示 ,底层接口
- Presenter表示,逻辑类
- Transaction表示,具体逻辑
- View表示界面接口
- Helper:表示静态函数
- Statements:表示字符串
- E表示enum
- ~BTN按钮
- 私有变量m_
- 获得Get
- 建立Build
- 生成Generate
- listbox 为 LB
一个项目体验
using System;using System.Windows.Forms;namespace AerationSystem{ static class Program { ////// 应用程序的主入口点。 /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); GetAllFrom getform = new GetAllFrom(); getform.MakeLoginForm(); getform.login.ShowDialog(); if(getform.login.DialogResult==DialogResult.OK) { getform.MakeAllForm(); Application.Run(getform.currentMain); //Application.Run(new Form1()); } } }}
public class XMLHelper{ ////// 读取多行同一标签属性 /// /// 地址 /// 标签 /// 属性 ///多行同一标签属性 public static string[] ReadMultipleTagOneAttribute(string filename,string nodeflag, string strflag) { try { XmlDocument xl = new XmlDocument(); xl.Load(filename); XmlNodeList xnl = xl.GetElementsByTagName("appSettings")[0].ChildNodes; Listvs = new List (); foreach (XmlNode cn in xnl) { if (cn.Name.Equals(nodeflag)) { vs.Add(cn.Attributes.GetNamedItem(strflag).Value); } } return vs.ToArray(); } catch (Exception ex) { Console.WriteLine(ex.StackTrace + ex.Message); } return null; } /// /// 读取同一标签多个属性,如果有多个同标签则返回null /// /// 地址 /// 标签 /// 多个属性 ///多个属性值 public static string[] ReadMultipleAttributeOneTag(string filename, string nodeflag, string[] strflag) { try { XmlDocument xl = new XmlDocument(); xl.Load(filename); XmlNodeList xnl = xl.GetElementsByTagName("appSettings")[0].ChildNodes; Listvs = new List (); int tagcount = 0; foreach (XmlNode cn in xnl) { if (cn.Name.Equals(nodeflag)) { foreach (string s in strflag) { vs.Add(cn.Attributes.GetNamedItem(s).Value); } tagcount++; } } if (tagcount > 1) { throw new Exception("出现多个相同标签"); } return vs.ToArray(); } catch (Exception ex) { Console.WriteLine(ex.StackTrace + ex.Message); } return null; }}
public class SQLDatabaseHelper{ ////// 返回多个表 /// /// 数据库URL /// 执行语句 ///public static DataSet QueryDs(String dbname, String sqlstr) { OleDbConnection Connection = new OleDbConnection(dbname); try { Connection.Open(); OleDbDataAdapter oleDbAdapter = new OleDbDataAdapter(sqlstr, Connection); DataSet ds = new DataSet(); oleDbAdapter.Fill(ds); return ds; } catch (Exception ex) { Console.WriteLine("打开数据库连接异常:" + ex.Message + "\r\n"); } finally { Connection.Close(); } return null; } /// /// 执行语句返会受影响函数 /// /// 数据库URL /// 执行语句 ///public static int Execute(String dbname, String sqlstr) { OleDbConnection Connection = new OleDbConnection(dbname); try { Connection.Open(); OleDbCommand oleDbCommand = new OleDbCommand(sqlstr, Connection); return oleDbCommand.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Connection.Close(); } return 0; } /// /// 执行多条语句 /// /// 数据库url /// 受影响的行数 ///public static int ExecuteAll(string dbname, string[] sqlstrs) { int count = 0; foreach (string s in sqlstrs) { count = count + Execute(dbname, s); } return count; } /// /// 返回表 /// /// 数据库URL /// 执行语句 ///受影响行数 public static DataTable QueryDt(String dbname, String sqlstr) { OleDbConnection Connection = new OleDbConnection(dbname); try { Connection.Open(); OleDbDataAdapter oleDbAdapter = new OleDbDataAdapter(sqlstr, Connection); OleDbCommandBuilder oleDbBuilder = new OleDbCommandBuilder(oleDbAdapter); DataSet ds = new DataSet(); oleDbAdapter.Fill(ds); return ds.Tables[0]; } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Connection.Close(); } return null; }}
private UserM rowtoUserM(DataRow dr){ if (dr == null) return null; UserM user = new UserM(); if (!DBNull.Value.Equals(dr["name"])) user.name = dr["name"].ToString(); if (!DBNull.Value.Equals(dr["password"])) user.password = dr["password"].ToString(); if (!DBNull.Value.Equals(dr["active"])) user.active = dr["active"].ToString(); if (!DBNull.Value.Equals(dr["caption"])) user.caption = dr["caption"].ToString(); if (!DBNull.Value.Equals(dr["pri"])) user.pri = dr["pri"].ToString(); return user;}
private SQLDataBaseM strToSqlDatabase(string str){ string catalog, server, username, userpassword; Match mt = Regex.Match(str, @"server=\w+\.\w+\.\w+\.\w+\,?(\w+)?"); if (!mt.Success) { return null; } server = mt.Value.Substring(7); mt = Regex.Match(str, @"id=\w+"); if (!mt.Success) { return null; } username = mt.Value.Substring(3); mt = Regex.Match(str, @"password=\w+@?\w+"); if (!mt.Success) { return null; } userpassword = mt.Value.Substring(9); mt = Regex.Match(str, @"catalog=\w+"); if (!mt.Success) { return null; } catalog = mt.Value.Substring(8); return new SQLDataBaseM(server, catalog, username, userpassword);}
public class SQLStatements{ ////// 通过pointcode获得point /// public static string GetPointByCodeStr = "select * from TB_MeasurePoint where MPointCode='{0}'"; public static string GetUserByNameAndPasswordStr = "SELECT * FROM TB_User where name='{0}' and password='{1}'"; public static string GetAllFactoryAreaStr = "select distinct BizType from TB_MeasurePoint where active = '启用'"; public static string GetAllpointTypesStr = "select distinct SignalType from TB_MeasurePoint where active = '启用'"; public static string GetAllEquipmentTypesStr = "select distinct scdtype from TB_MeasurePoint where active = '启用'"; ////// 获得钱100个point的值 /// public static string GetTop100PintsByWhereStr = "select top 100 * from TB_MeasurePoint where {0} AND ParmValue > -9999 order by measuredt desc"; ////// 通过约束获得measurepoint /// public static string GetPintsByWhereStr = "select * from TB_MeasurePoint where {0} order by measuredt desc"; ////// 获得前100个数据 /// public static string GetPartlyParasWhereStr = "select top 100 * from tb_mp_{0} where {1} AND ParmValue > -9999 order by measuredt desc"; ////// 查询数据获得翻页效果,第一个是code,第二个是(页数-1)*100,第三个是约束 /// public static string GetParasWhereByPageStr = " select top 100 * from tb_mp_{0} where ItemID not in (select top {1} ItemID from tb_mp_{2} where {3} AND ParmValue > -9999 order by measuredt desc ) AND {4} AND ParmValue > -9999 order by measuredt desc "; ////// 数量,最大值,最小值,平均值 /// public static string GetCountMaxMinAvgParaStr = "SELECT COUNT(ParmValue), MAX(ParmValue),MIN(ParmValue),AVG(ParmValue) FROM TB_MP_{0} where {1} AND ParmValue > -9999"; ////// 将点位变成对应数据写到历史数据里 /// public static string GetSpeciPointsByWhereStr = "select MPOINTID,MPOINTCODE,PARMNAME,ISNULL(ParmName, '未知') +'['+MPOINTCODE+']' as 测量点,alarmmax as 超标上限,alarmmin as 超标下限,forcemax as 纵轴上限,forcemin as 纵轴下限,spanrange as 量程,rate,SignalType,Unit,NumTail,biztype,scdtype,morder from TB_MeasurePoint where {0} AND ParmValue > -9999 order by measuredt desc"; ////// 获得point的第二个值 /// public static string GetSecondValueByCodeStr = "select top 2 ParmValue from tb_mp_{0} where ParmValue > -9999 order by measuredt desc"; ////// 获得点的最新的数据时间 /// public static string GetLastDateTimeByCodeStr = "select top 1 measuredt from tb_mp_{0} where ParmValue > -9999 order by measuredt desc"; public static string GetPointDataByCodeStr = "select * from tb_mp_{0} where {1} AND ParmValue > -9999 order by measuredt desc";}
DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
public void GenerateReportTable(SearchConstrainA sca){ if (sca != null) { string startpath = Application.StartupPath + "\\日报表\\"; if (!Directory.Exists(startpath)) { Directory.CreateDirectory(startpath); } startpath = startpath + "" + sca.reporttime.ToString() + sca.PumpType.ToString()+".xls"; ExcelHelper.CopyExcel(startpath); DataTable dt = database.GetDataFromSC(sca); if (dt == null) { allFrom.form.ShowMessageBox(sca.reporttime + "没有数据"); return; } allFrom.form.ShowMessageBox("写入参数", ExcelHelper.FillExcel(dt, startpath, sca)); }}
using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Runtime.InteropServices;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace PunchReport{ public class ExcelHelper { public static void CopyExcel(string targetpath) { Excel.Application xApp = new Excel.ApplicationClass(); xApp.WindowState = Excel.XlWindowState.xlMinimized; xApp.DisplayAlerts = false; xApp.Visible = false; object MissingValue = Type.Missing; Excel.Workbook xBook = xApp.Workbooks._Open(@"" + Application.StartupPath + "\\report.xls", MissingValue, MissingValue, MissingValue, MissingValue , MissingValue, MissingValue, MissingValue, MissingValue , MissingValue, MissingValue, MissingValue, MissingValue); xBook._SaveAs(@"" + targetpath, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, Excel.XlSaveAsAccessMode.xlNoChange, MissingValue, MissingValue, MissingValue, MissingValue); xBook = null; xApp.Quit(); Kill(xApp); xApp = null; } public static bool FillExcel(DataTable dt, string targetpath,SearchConstrainA sca) { if (dt == null && dt.Rows.Count < 0) return false; object MissingValue = Type.Missing; Excel.Application xApp = new Excel.ApplicationClass(); Excel.Workbook xBook; xApp.WindowState = Excel.XlWindowState.xlMinimized; xApp.DisplayAlerts = false; xApp.Visible = false; try { xBook = xApp.Workbooks._Open(@"" + targetpath, MissingValue, MissingValue, MissingValue, MissingValue , MissingValue, MissingValue, MissingValue, MissingValue , MissingValue, MissingValue, MissingValue, MissingValue); Excel.Worksheet xSheet = (Excel.Worksheet)xBook.Sheets["统计表"]; Excel.Range tilterng = xSheet.get_Range("A1", MissingValue); tilterng.Value2 = sca.PumpType.ToString() + "日报表"; Excel.Range tmprng = xSheet.get_Range("A2", MissingValue); tmprng.Value2 = "报表日期: " + DateTime.Parse(sca.reporttime).ToString("yyyy年MM月dd日"); for (int j = 0; j < dt.Rows.Count; j++) { for (int i = 0; i < 4; i++) { tmprng = xSheet.get_Range(getColName("A", i) + (4 + j).ToString(), MissingValue); bool a = true; if (tmprng.HasFormula.Equals(a)) { continue; } else { tmprng.Value2 = dt.Rows[j][i].ToString(); } } } xBook.Save(); return true; } catch (Exception ex) { BackLogHelper.LogWrite(ex.StackTrace + ex.Message); return false; } finally { xBook = null; xApp.Quit(); Kill(xApp); xApp = null; } } private static string getColName(string strTemp, int inc) { int i = strTemp.Length; char[] ca = new char[i]; ca = strTemp.ToCharArray(); int w = i - 1; int AddResult = (int)ca[w]; AddResult += inc; if (AddResult >= 91)//需要进一 { ca[w] = (char)(AddResult - 91 + 65); if (w > 0) { ca[w - 1] = (char)((int)ca[w - 1] + 1); strTemp = ca[w - 1].ToString() + ca[w].ToString(); } else { strTemp = "A" + ca[w].ToString(); } } else { strTemp = ""; ca[w] = (char)(AddResult); while (w >= 0) { strTemp = ca[w].ToString() + strTemp; w--; } } return strTemp; } [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); public static void Kill(Excel.Application xlapp) { try { IntPtr app = new IntPtr(xlapp.Hwnd); //得到这个句柄,具体作用是得到这块内存入口 int processid = 0; GetWindowThreadProcessId(app, out processid); //得到本进程唯一标志k System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(processid); p.Kill(); //关闭进程k } catch { } } }}
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace PunchReport{ public class BackLogHelper { public static void LogWrite(String memo) { try { StreamWriter sr; //String filename = DateTime.Now.ToShortDateString() + ".txt"; String filename = DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; if (!Directory.Exists(Application.StartupPath + "\\logs\\log\\")) { Directory.CreateDirectory(Application.StartupPath + "\\logs\\log\\"); } if (!File.Exists(Application.StartupPath + "\\logs\\log\\" + filename)) { sr = File.CreateText(Application.StartupPath + "\\logs\\log\\" + filename); sr.Close(); } sr = File.AppendText(Application.StartupPath + "\\logs\\log\\" + filename); sr.WriteLine(memo); sr.Close(); } catch (System.Exception ex) { Console.WriteLine("写入日志异常:" + ex); } } }}
string sqlname = ConfigurationManager.AppSettings["SQLName"].ToString();string sqlip = ConfigurationManager.AppSettings["SQLIP"].ToString();string userid = ConfigurationManager.AppSettings["UserID"].ToString();string userpassword = ConfigurationManager.AppSettings["UserPassword"].ToString();string removesstr= ConfigurationManager.AppSettings["Remove"].ToString();
自定义控件
- Screen.PrimaryScreen.WorkingArea.Width;获取桌面宽度,hight高度
- this.size程序宽度
- base.Invalidate(this.MenuRect)重绘矩形区域
- this.FormBorderStyle = FormBorderStyle.None;无边框
- this.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.Selectable | ControlStyles.ContainerControl | ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.Opaque, false); this.UpdateStyles(); 绘制控件样式
- Graphics g = e.Graphics;获取画布,如果是创建的使用完后要注销
- FormWindowState.Maximized窗口状态
- FormStartPosition.CenterParent窗体开启位置
- 继承form的重载类中WndProc有窗体循环,在该循环中提前捕获消息进行拦截。
设置背景图片 totalpic.ImageLocation = System.Windows.Forms.Application.StartupPath + "\img\" + comboBox2.Text.ToString() + ".jpg";
使得panel1不可见的时候panel2填满panel1的区域,让panel1的dock设置为top,panel2的dock设置为fill。