using Devart.Data; using MaiMuAOI.SysCtrl; using MaiMuAOI.SysUI.ProductAndStep; using MaiMuControl.SysStatusMgr.UserMgr; using Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OpenCvSharp.Flann; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.Common; using System.Drawing; using System.Dynamic; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.InteropServices.ComTypes; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Web.Routing; using System.Web.UI.WebControls; using System.Windows.Forms; using static MaiMuControl.Form1; namespace MaiMuAOI.SysUI.DefectPicShow { public partial class DataQueryFrm : Form { Service.OrderService OrderService = new Service.OrderService(); List QueryOrders = new List(); List QueryAllOrders = new List(); List ItemName = new List(); List labels = new List(); public DataQueryFrm() { InitializeComponent(); UIStyle.SetUIStyle(this); this.uiTitel1.FatherForm = this; //反射 循环 获取数据 labels.Add("Tension"); labels.Add("Height"); Type t = typeof(PointTestType); FieldInfo[] fieldInfos = t.GetFields(); foreach (var item in fieldInfos) { //不是枚举字段不处理 if (item.FieldType.IsEnum) { //名称可以直接获取 ItemName.Add(item.Name); labels.Add(item.Name); } } } private void DataQueryFrm_Load(object sender, EventArgs e) { LoadPdtList(SysMgr.Instance.ProductCodeList); //激活OnPageChanged事件 pageCtrl1.OnPageChanged += new EventHandler(pagerControl1_OnPageChanged); } #region 切页 /// /// 页数变化时调用绑定数据方法 /// /// /// private void pagerControl1_OnPageChanged(object sender, EventArgs e) { QueryData(); } #endregion #region 加载料号 private string[] pdtlistData; private void LoadPdtList(List list) { this.cbProductCode.Items.Clear(); this.pdtlistData = list.ToArray(); cbProductCode.Items.AddRange(pdtlistData);//比使用DataSource速度要快一些 cbProductCode.TextUpdate += cobList_TextUpdate;//重新绑定事件 cbProductCode.KeyDown += CobList_KeyDown; this.cbProductCode.Text = ""; cbProductCode.Focus(); cbProductCode.SelectAll(); } private void CobList_KeyDown(object sender, KeyEventArgs e) { ComboBox ctrl = sender as ComboBox; if (e.KeyCode == Keys.Enter) { if (ctrl.Items.Count == 1) ctrl.Text = ctrl.Items[0].ToString(); } } private void cobList_TextUpdate(object sender, EventArgs e) { ComboBox ctrl = sender as ComboBox; if (ctrl.Text != null) { string str = ctrl.Text; //获取cb_material控件输入内 //清空combobox ctrl.DataSource = null; ctrl.Items.Clear(); string[] workOrderFiltered; workOrderFiltered = pdtlistData.Where(x => x.IndexOf(str, StringComparison.CurrentCultureIgnoreCase) != -1).ToArray();//忽略大小写 ctrl.Items.AddRange(workOrderFiltered);//比使用DataSource速度要快一些 // 不存在符合条件时 //设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列 ctrl.Cursor = Cursors.Default; //保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置 if (workOrderFiltered.Length > 0) { if (!ctrl.DroppedDown) ctrl.DroppedDown = true; // 自动弹出下拉框 } ctrl.SelectionStart = str.Length; // 设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列 } } #endregion #region 查询数据 #region 数据库查询 private class domainItem { public string FieldName { get; set; } public string FieldValue { get; set; } public int ConditionalType { get; set; } } private class QueryOrderData { public string model { get; set; } public string fields { get; set; } public List domain { get; set; } public string order { get; set; } public int pageNum { get; set; } public int pageSize { get; set; } } private List getTableList(JObject req, out int TotalCnt) { try { string model, fields = "", domain = "", order = ""; int pageNum = 0, pageSize = 0, totalCount = 0; model = req.Value("model"); if (req.ContainsKey("fields")) fields = req.Value("fields"); if (req.ContainsKey("domain")) domain = req.Value("domain").ToString(); if (req.ContainsKey("order")) order = req.Value("order"); if (req.ContainsKey("pageNum")) pageNum = req.Value("pageNum"); if (req.ContainsKey("pageSize")) pageSize = req.Value("pageSize"); //创建表达式 var exp1 = Expressionable.Create() //.AndIF((int)cobProductList.SelectedValue > 0, it => it.ProductId == (int)cobProductList.SelectedValue) //.AndIF((int)cobStepList.SelectedValue > 0, it => it.StepId == (int)cobStepList.SelectedValue) //.AndIF(dateTimePicker1.Checked, it => it.CreateTime >= dateTimePicker1.Value) //.AndIF(dateTimePicker2.Checked, it => it.CreateTime < dateTimePicker2.Value) .ToExpression();//注意 这一句 不能少 var list = OrderService.GetListEx(fields, domain, order, pageNum, pageSize, ref totalCount); TotalCnt = totalCount; //var list = svcOrder.GetListNav(pageNum, pageSize, ref totalCount, exp1); return list; } catch (Exception ex) { ; } TotalCnt = 0; return null; } #endregion #region 新老流程数据分析 private void ShowDataTableEx(List list) { dataGridView1.Columns.Clear(); //记录数据类型列数 Dictionary dataCnt = new Dictionary(); DataTable dt = new DataTable(); //建立个数据表 //通用列 DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn(); chk.Name = "Select"; chk.HeaderText = "选择"; dataGridView1.Columns.Add(chk); dt.Columns.Add(new DataColumn("检验日期", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("检测单号", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("产品名称", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("料号", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("网版编码", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("批次", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("合格", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("修复", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("异常情况", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("修复人员", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("比对", typeof(string)));//在表中添加string类型的列 foreach(var item in list) { //老流程 if(item.StepInfo == null ||item.StepInfo.ProcessType != "快速流程") { //加入数据表 if(item.SizeDefectInfoList == null) item.SizeDefectInfoList = new List(); #region 张力 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension5, }); #endregion #region 厚度 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height5, }); #endregion #region YPT item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT5, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT6, }); #endregion #region 线宽 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth5, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth6, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth7, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth8, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth9, }); #endregion if (!dataCnt.ContainsKey("张力")) dataCnt.Add("张力", 5); else if (dataCnt["张力"] < 5) dataCnt["张力"] = 5; if (!dataCnt.ContainsKey("厚度")) dataCnt.Add("厚度", 5); else if (dataCnt["厚度"] < 5) dataCnt["厚度"] = 5; if (!dataCnt.ContainsKey("Y轴方向PT值检测")) dataCnt.Add("Y轴方向PT值检测", 5); else if (dataCnt["Y轴方向PT值检测"] < 5) dataCnt["Y轴方向PT值检测"] = 5; if (!dataCnt.ContainsKey("线宽正面")) dataCnt.Add("线宽正面", 9); else if (dataCnt["线宽正面"] < 9) dataCnt["线宽正面"] = 9; } else { //string[] pointType = new string[19] {"Tension", "Height", "Y轴方向PT值检测" , "线宽正面" , "反面检测" , // "X轴方向PT值检测","主栅连接线检测","主栅宽度检测","主栅间距","细栅间距检测","背极宽度", // "主栅长度检测","Mark点横向间距","Mark点竖向间距","鱼叉口长","鱼叉口宽","鱼叉口间距", "蜈蚣角长", "蜈蚣角宽"}; //按照检测项目分类 //string[] pointType = labels.ToArray(); //for (int i = 0; i < pointType.Length; i++) //{ // List t = item.SizeDefectInfoList.Where(q => q.PointCode == pointType[i]).ToList(); // if (t.Count > 0) // { // //当前测试项数据个数 // if (!dataCnt.ContainsKey(pointType[i])) // dataCnt.Add(pointType[i], t.Count); // else // if (dataCnt[pointType[i]] < t.Count) // dataCnt[pointType[i]] = t.Count; // } //} //按照步骤流程分类 string[] pointType = item.SizeDefectInfoList.Select(t => t.StepName).Distinct().ToList().ToArray(); for (int i = 0; i < pointType.Length; i++) { List t = item.SizeDefectInfoList.Where(q => q.StepName == pointType[i]).ToList(); if (t.Count > 0) { //当前测试项数据个数 if (!dataCnt.ContainsKey(pointType[i])) dataCnt.Add(pointType[i], t.Count); else if (dataCnt[pointType[i]] < t.Count) dataCnt[pointType[i]] = t.Count; } } } } //插入列 foreach (var item in dataCnt) { //按步骤名称插入列 for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"{item.Key}-{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn($"{item.Key}均值", typeof(string))); #if false switch (item.Key) { case "Tension": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"张力{i+1}", typeof(string))); dt.Columns.Add(new DataColumn("张力均值", typeof(string))); break; case "Height": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"厚度{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("厚度均值", typeof(string))); break; case "Y轴方向PT值检测": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"Y轴方向PT值{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("Y轴方向PT值均值", typeof(string))); break; case "线宽正面": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"线宽正面{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("线宽正面均值", typeof(string))); break; case "反面检测": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"反面检测{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("反面检测均值", typeof(string))); break; case "X轴方向PT值检测": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"X轴方向PT值{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("X轴方向PT值均值", typeof(string))); break; case "主栅连接线检测": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"主栅连接线检测值{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("主栅连接线检测均值", typeof(string))); break; case "主栅宽度检测": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"主栅宽度检测值{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("主栅宽度检测均值", typeof(string))); break; case "主栅间距": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"主栅间距值{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("主栅间距均值", typeof(string))); break; case "细栅间距检测": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"细栅间距检测值{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("细栅间距检测均值", typeof(string))); break; case "背极宽度": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"背极宽度值{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("背极宽度均值", typeof(string))); break; case "主栅长度检测": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"主栅长度检测{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("主栅长度检测均值", typeof(string))); break; case "Mark点横向间距": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"Mark点横向间距{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("Mark点横向间距均值", typeof(string))); break; case "Mark点竖向间距": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"Mark点竖向间距{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("Mark点竖向间距均值", typeof(string))); break; case "鱼叉口长": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"鱼叉口长{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("鱼叉口长均值", typeof(string))); break; case "鱼叉口宽": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"鱼叉口宽{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("鱼叉口宽均值", typeof(string))); break; case "鱼叉口间距": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"鱼叉口间距{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("鱼叉口间距均值", typeof(string))); break; case "蜈蚣角长": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"蜈蚣角长{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("蜈蚣角长均值", typeof(string))); break; case "蜈蚣角宽": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"蜈蚣角宽{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("蜈蚣角宽均值", typeof(string))); break; case "分片间隔": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"分片间隔{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("分片间隔均值", typeof(string))); break; case "焊点长": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"焊点长{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("焊点长均值", typeof(string))); break; case "焊点宽": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"焊点宽{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("焊点宽均值", typeof(string))); break; case "焊点间隔": for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"焊点间隔{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn("焊点间隔均值", typeof(string))); break; } #endif } dt.Columns.Add(new DataColumn("堵孔数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("脏污数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("钢丝异常数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("纤维丝数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("缺口数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("针孔数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("泡泡数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("划伤数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("压线数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("斜边数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("栅线数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("钢丝断裂数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("残胶堵孔数量", typeof(int)));//在表中添加int类型的列 //插入按钮 dataGridView1.DataSource = dt; //在datagridview中添加button按钮 //DataGridViewButtonColumn btn = new DataGridViewButtonColumn(); //btn.Name = "Modify"; //btn.HeaderText = "操作"; //btn.DefaultCellStyle.NullValue = "修改"; //dataGridView1.Columns.Add(btn); //DataGridViewButtonColumn btn2 = new DataGridViewButtonColumn(); //btn2.Name = "HistoryView"; //btn2.HeaderText = "查看"; //btn2.DefaultCellStyle.NullValue = "历史"; //dataGridView1.Columns.Add(btn2); DataGridViewButtonColumn btn3 = new DataGridViewButtonColumn(); btn3.Name = "Distribution"; btn3.HeaderText = "缺陷分布"; btn3.DefaultCellStyle.NullValue = "分布"; dataGridView1.Columns.Add(btn3); DataTable dts = (DataTable)dataGridView1.DataSource; dts.Clear(); foreach (var item in list) { //新增 DataRow dr;//行 dr = dts.NewRow(); //dr["选择"] = false; dr["检验日期"] = item.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"); dr["检测单号"] = item.DetectOrder; dr["产品名称"] = item.ProductInfo.Name; dr["料号"] = item.ProductInfo.Code; dr["网版编码"] = item.SN; dr["批次"] = item.BatchId; dr["合格"] = item.Qualified ? "合格": "不合格"; dr["修复"] = item.State == 10 ? "异常" : item.State == 5 ? "修复" : "待修复"; dr["异常情况"] = item.Abnormalities; dr["修复人员"] = item.RepairCode; dr["比对"] = item.CompareResult == 2 ? "不通过" : item.CompareResult == 1 ? "通过" : "未比对"; //根据不同步骤名称插入数据 List tempd = new List(); foreach (var tdata in dataCnt) { tempd = item.SizeDefectInfoList.Where(q => q.StepName == tdata.Key).ToList(); List dataList = new List(); for (int i = 0; i < tempd.Count; i++) { dataList.Add(tempd[i].Data); dr[$"{tdata.Key}-{i + 1}"] = tempd[i].Data.ToString("0.0000"); } if (dataList.Count > 0) dr[$"{tdata.Key}均值"] = dataList.Average().ToString("0.0000"); else dr[$"{tdata.Key}均值"] = "0"; #if false switch (tdata.Key) { case "Tension": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "Tension").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"张力{i + 1}"] = tempd[i].Data.ToString("0.00") ; dr["张力均值"] = item.TensionValue.ToString("0.00"); break; case "Height": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "Height").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"厚度{i + 1}"] = tempd[i].Data.ToString("0.00"); dr["厚度均值"] = item.HeightValue.ToString("0.00"); break; case "Y轴方向PT值检测": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "Y轴方向PT值检测").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"Y轴方向PT值{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["Y轴方向PT值均值"] = item.PTValue.ToString("0.0000"); break; case "线宽正面": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "线宽正面").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"线宽正面{i + 1}"] = tempd[i].Data.ToString("0.00"); dr["线宽正面均值"] = item.LineWidthValue.ToString("0.00"); break; case "反面检测": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "反面检测").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"反面检测{i + 1}"] = tempd[i].Data.ToString("0.00"); dr["反面检测均值"] = item.FLineWidthValue.ToString("0.00"); break; case "X轴方向PT值检测": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "X轴方向PT值检测").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"X轴方向PT值{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["X轴方向PT值均值"] = item.XPTValue.ToString("0.0000"); break; case "主栅连接线检测": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "主栅连接线检测").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"主栅连接线检测值{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["主栅连接线检测均值"] = item.MGridIntervalValue.ToString("0.0000"); break; case "主栅宽度检测": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "主栅宽度检测").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"主栅宽度检测值{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["主栅宽度检测均值"] = item.MGridWidthValue.ToString("0.0000"); break; case "主栅间距": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "主栅间距").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"主栅间距值{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["主栅间距均值"] = item.MGridSpreadValue.ToString("0.0000"); break; case "细栅间距检测": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "细栅间距检测").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"细栅间距检测值{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["细栅间距检测均值"] = item.FGridSpreadValue.ToString("0.0000"); break; case "背极宽度": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "背极宽度").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"背极宽度值{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["背极宽度均值"] = item.BackPoleWidthValue.ToString("0.0000"); break; case "主栅长度检测": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "主栅长度检测").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"主栅长度检测{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["主栅长度检测均值"] = item.MGridLengthValue.ToString("0.0000"); break; case "Mark点横向间距": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "Mark点横向间距").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"Mark点横向间距{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["Mark点横向间距均值"] = item.MarkXDisValue.ToString("0.0000"); break; case "Mark点竖向间距": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "Mark点竖向间距").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"Mark点竖向间距{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["Mark点竖向间距均值"] = item.MarkYDisValue.ToString("0.0000"); break; case "鱼叉口长": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "鱼叉口长").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"鱼叉口长{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["鱼叉口长均值"] = item.ForkLengthValue.ToString("0.0000"); break; case "鱼叉口宽": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "鱼叉口宽").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"鱼叉口宽{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["鱼叉口宽均值"] = item.ForkWidthValue.ToString("0.0000"); break; case "鱼叉口间距": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "鱼叉口间距").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"鱼叉口间距{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["鱼叉口间距均值"] = item.ForkDisValue.ToString("0.0000"); break; case "蜈蚣角长": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "蜈蚣角长").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"蜈蚣角长{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["蜈蚣角均值"] = item.ChilopodLengthValue.ToString("0.0000"); break; case "蜈蚣角宽": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "蜈蚣角宽").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"蜈蚣角宽{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["蜈蚣角宽均值"] = item.ChilopodWidthValue.ToString("0.0000"); break; case "分片间隔": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "分片间隔").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"分片间隔{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["分片间隔均值"] = item.MarkYDisValue.ToString("0.0000"); break; case "焊点长": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "焊点长").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"焊点长{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["焊点长均值"] = item.ForkLengthValue.ToString("0.0000"); break; case "焊点宽": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "焊点宽").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"焊点宽{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["焊点宽均值"] = item.ForkWidthValue.ToString("0.0000"); break; case "焊点间隔": tempd = item.SizeDefectInfoList.Where(q => q.PointCode == "焊点间隔").ToList(); for (int i = 0; i < tempd.Count; i++) dr[$"焊点间隔{i + 1}"] = tempd[i].Data.ToString("0.0000"); dr["焊点间隔均值"] = item.ForkDisValue.ToString("0.0000"); break; } #endif } dr["堵孔数量"] = item.DKCount; dr["脏污数量"] = item.ZWCount; dr["钢丝异常数量"] = item.GSYCCount; dr["纤维丝数量"] = item.XWSCount; dr["缺口数量"] = item.QKCount; dr["针孔数量"] = item.ZKCount; dr["泡泡数量"] = item.PPCount ; dr["划伤数量"] = item.HSCount; dr["压线数量"] = item.YXCount; dr["斜边数量"] = item.XBCount; dr["栅线数量"] = item.SXCount; dr["钢丝断裂数量"] = item.GSDLCount; dr["残胶堵孔数量"] = item.CJDKCount; dts.Rows.Add(dr);//在表的对象的行里添加此行 } //dts.DefaultView.Sort = "时间戳 desc"; //dts = dts.DefaultView.ToTable(); dataGridView1.DataSource = dts; this.dataGridView1.Columns[0].Width = 50; this.dataGridView1.Columns[1].Width = 120; for (int i = 0; i < 12; i++) { this.dataGridView1.Columns[i].Frozen = true; } return; } #endregion private void QueryData() { QueryOrderData queryOrderData = new QueryOrderData(); queryOrderData.model = "order"; queryOrderData.fields = "*"; queryOrderData.order = "id desc"; queryOrderData.pageNum = this.pageCtrl1.PageIndex; queryOrderData.pageSize = this.pageCtrl1.PageSize; queryOrderData.domain = new List(); domainItem startTime = new domainItem(); startTime.FieldName = "CreateTime"; startTime.FieldValue = dateTimePicker1.Value.ToString("yyyy-M-d"); startTime.ConditionalType = 3; queryOrderData.domain.Add(startTime); domainItem endTime = new domainItem(); endTime.FieldName = "CreateTime"; endTime.FieldValue = dateTimePicker2.Value.ToString("yyyy-M-d") + " 23:59:59"; endTime.ConditionalType = 5; queryOrderData.domain.Add(endTime); //OrderService.GetList //产品条件 if (!string.IsNullOrEmpty(cbProductCode.Text)) { domainItem ProductCode = new domainItem(); ProductCode.FieldName = "ProductId"; ProductCode.FieldValue = SysMgr.Instance.ProductIdList[cbProductCode.SelectedIndex].ToString(); ProductCode.ConditionalType = 6; queryOrderData.domain.Add(ProductCode); } //合格条件 if (!string.IsNullOrEmpty(comboBox2.Text)) { domainItem CompareResult = new domainItem(); CompareResult.FieldName = "Qualified"; CompareResult.FieldValue = comboBox2.Text == "合格"? "1":"0"; CompareResult.ConditionalType = 0; queryOrderData.domain.Add(CompareResult); } //比对条件 if (!string.IsNullOrEmpty(comboBox1.Text)) { domainItem CompareResultOptions = new domainItem(); CompareResultOptions.FieldName = "CompareResult"; CompareResultOptions.FieldValue = comboBox1.Text == "通过" ? "1" : comboBox1.Text == "未通过" ? "2" : "0"; CompareResultOptions.ConditionalType = 0; queryOrderData.domain.Add(CompareResultOptions); } //异常条件 if (!string.IsNullOrEmpty(comboBox3.Text)) { domainItem State = new domainItem(); State.FieldName = "State"; State.FieldValue = comboBox3.Text == "修复" ? "5" : comboBox3.Text == "未修复" ? "0" : "10"; State.ConditionalType = 0; queryOrderData.domain.Add(State); } int totalcnt = 0; JObject str = JObject.Parse(JsonConvert.SerializeObject(queryOrderData)); var list = getTableList(str, out totalcnt); this.pageCtrl1.DrawControl(totalcnt); QueryOrders = list; //自动生成表格 ShowDataTableEx(list); //总数居 queryOrderData.pageNum = 0; queryOrderData.pageSize = 0; JObject str2 = JObject.Parse(JsonConvert.SerializeObject(queryOrderData)); var list2 = getTableList(str2, out totalcnt); QueryAllOrders = list2; } private void skinButton2_Click(object sender, EventArgs e) { pageCtrl1.PageIndex = 1; QueryData(); } #endregion #region 表格单击 #region 更新数据 #endregion private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { int Index = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引 if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "操作") { //修改数据 AmendantRecordFrm recordFrm = new AmendantRecordFrm(QueryOrders[Index]); recordFrm.ShowDialog(); //重新显示 QueryData(); } else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "查看") { //查看历史 HistoryViewFrm Frm = new HistoryViewFrm(QueryOrders[Index]); Frm.ShowDialog(); } else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "缺陷分布") { //缺陷分布 DistributionFrm Frm = new DistributionFrm(QueryOrders[Index]); Frm.WindowState = FormWindowState.Maximized; Frm.ShowDialog(); } else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "选择") { DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[Index].Cells[0]; Boolean flag = Convert.ToBoolean(checkCell.Value); if (flag == true) //查找被选择的数据行 { checkCell.Value = false; } else checkCell.Value = true; } } #endregion #region 界面调整 private void DataQueryFrm_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Maximized) { this.WindowState = FormWindowState.Normal; this.Top = 0; this.Left = 0; this.Width = SystemInformation.WorkingArea.Width; this.Height = SystemInformation.WorkingArea.Height; } } #endregion #region 删除 private int delTableList(JObject req) { JObject res = new JObject(); try { string model = req.Value("model"); string domain = req.Value("domain").ToString(); //var idArr = req.Value("idList"); //List ids = new List(); //foreach (int id in idArr) ids.Add(id); int result = OrderService.DeleteList(model, domain); return 1; } catch (Exception ex) { } return 0; } private void skinButton3_Click(object sender, EventArgs e) { for (int i = 0; i < dataGridView1.Rows.Count; i++) { DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[i].Cells[0]; Boolean flag = Convert.ToBoolean(checkCell.Value); if(flag == true) { QueryOrderData delOrderData = new QueryOrderData(); delOrderData.model = "order"; delOrderData.domain = new List(); domainItem doitem = new domainItem(); doitem.FieldName = "Id"; doitem.FieldValue = QueryOrders[i].Id.ToString(); doitem.ConditionalType = 6; delOrderData.domain.Add(doitem); JObject str = JObject.Parse(JsonConvert.SerializeObject(delOrderData)); int ret = delTableList(str); if (ret == 1) { //删除历史 QueryOrderData HistoryOrderData = new QueryOrderData(); HistoryOrderData.model = "OrderHistory"; HistoryOrderData.domain = new List(); domainItem doitem2 = new domainItem(); doitem2.FieldName = "Pid"; doitem2.FieldValue = QueryOrders[i].Id.ToString(); doitem2.ConditionalType = 6; HistoryOrderData.domain.Add(doitem2); JObject str2 = JObject.Parse(JsonConvert.SerializeObject(HistoryOrderData)); delTableList(str2); } } } //重新显示 QueryData(); } #endregion #region Excel导出 private void ShowAllDataTableEx(string filePath) { //记录数据类型列数 Dictionary dataCnt = new Dictionary(); DataTable dt = new DataTable(); //建立个数据表 //通用列 dt.Columns.Add(new DataColumn("检验日期", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("检测单号", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("产品名称", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("料号", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("网版编码", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("批次", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("合格", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("修复", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("异常情况", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("修复人员", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("比对", typeof(string)));//在表中添加string类型的列 foreach (var item in QueryAllOrders) { //老流程 if (item.StepInfo == null || item.StepInfo.ProcessType != "快速流程") { //加入数据表 if (item.SizeDefectInfoList == null) item.SizeDefectInfoList = new List(); #region 张力 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension5, }); #endregion #region 厚度 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height5, }); #endregion #region YPT item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT5, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT6, }); #endregion #region 线宽 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth5, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth6, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth7, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth8, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth9, }); #endregion if (!dataCnt.ContainsKey("张力")) dataCnt.Add("张力", 5); else if (dataCnt["张力"] < 5) dataCnt["张力"] = 5; if (!dataCnt.ContainsKey("厚度")) dataCnt.Add("厚度", 5); else if (dataCnt["厚度"] < 5) dataCnt["厚度"] = 5; if (!dataCnt.ContainsKey("Y轴方向PT值检测")) dataCnt.Add("Y轴方向PT值检测", 5); else if (dataCnt["Y轴方向PT值检测"] < 5) dataCnt["Y轴方向PT值检测"] = 5; if (!dataCnt.ContainsKey("线宽正面")) dataCnt.Add("线宽正面", 9); else if (dataCnt["线宽正面"] < 9) dataCnt["线宽正面"] = 9; } else { //按照步骤流程分类 string[] pointType = item.SizeDefectInfoList.Select(t => t.StepName).Distinct().ToList().ToArray(); for (int i = 0; i < pointType.Length; i++) { List t = item.SizeDefectInfoList.Where(q => q.StepName == pointType[i]).ToList(); if (t.Count > 0) { //当前测试项数据个数 if (!dataCnt.ContainsKey(pointType[i])) dataCnt.Add(pointType[i], t.Count); else if (dataCnt[pointType[i]] < t.Count) dataCnt[pointType[i]] = t.Count; } } } } //插入列 foreach (var item in dataCnt) { //按步骤名称插入列 for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"{item.Key}-{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn($"{item.Key}均值", typeof(string))); } dt.Columns.Add(new DataColumn("堵孔数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("脏污数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("钢丝异常数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("纤维丝数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("缺口数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("针孔数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("泡泡数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("划伤数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("压线数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("斜边数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("栅线数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("钢丝断裂数量", typeof(int)));//在表中添加int类型的列 dt.Columns.Add(new DataColumn("残胶堵孔数量", typeof(int)));//在表中添加int类型的列 foreach (var item in QueryAllOrders) { //新增 DataRow dr;//行 dr = dt.NewRow(); //dr["选择"] = false; dr["检验日期"] = item.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"); dr["检测单号"] = item.DetectOrder; dr["产品名称"] = item.ProductInfo.Name; dr["料号"] = item.ProductInfo.Code; dr["网版编码"] = item.SN; dr["批次"] = item.BatchId; dr["合格"] = item.Qualified ? "合格" : "不合格"; dr["修复"] = item.State == 10 ? "异常" : item.State == 5 ? "修复" : "待修复"; dr["异常情况"] = item.Abnormalities; dr["修复人员"] = item.RepairCode; dr["比对"] = item.CompareResult == 2 ? "不通过" : item.CompareResult == 1 ? "通过" : "未比对"; List tempd = new List(); foreach (var tdata in dataCnt) { tempd = item.SizeDefectInfoList.Where(q => q.StepName == tdata.Key).ToList(); List dataList = new List(); //for (int i = 0; i < tempd.Count; i++) // dr[$"{tdata.Key}-{i + 1}"] = tempd[i].Data.ToString("0.0000"); //dr[$"{tdata.Key}均值"] = item.TensionValue.ToString("0.0000"); for (int i = 0; i < tempd.Count; i++) { dataList.Add(tempd[i].Data); dr[$"{tdata.Key}-{i + 1}"] = tempd[i].Data.ToString("0.0000"); } if (dataList.Count > 0) dr[$"{tdata.Key}均值"] = dataList.Average().ToString("0.0000"); else dr[$"{tdata.Key}均值"] = "0"; } dr["堵孔数量"] = item.DKCount; dr["脏污数量"] = item.ZWCount; dr["钢丝异常数量"] = item.GSYCCount; dr["纤维丝数量"] = item.XWSCount; dr["缺口数量"] = item.QKCount; dr["针孔数量"] = item.ZKCount; dr["泡泡数量"] = item.PPCount; dr["划伤数量"] = item.HSCount; dr["压线数量"] = item.YXCount; dr["斜边数量"] = item.XBCount; dr["栅线数量"] = item.SXCount; dr["钢丝断裂数量"] = item.GSDLCount; dr["残胶堵孔数量"] = item.CJDKCount; dt.Rows.Add(dr);//在表的对象的行里添加此行 } try { // 创建一个新的CSV文件并写入数据 using (StreamWriter writer = new StreamWriter(filePath, false, UnicodeEncoding.GetEncoding("GB2312"))) { // 写入CSV文件的标题行 for (int i = 0; i < dt.Columns.Count; i++) { writer.Write(dt.Columns[i].ColumnName + ","); } writer.Write("\r\n"); for (int i = 0; i < dt.Rows.Count; i++) { // 写入数据行 for (int j = 0; j < dt.Columns.Count; j++) { writer.Write(dt.Rows[i][j] + ","); } writer.Write("\r\n"); //Console.WriteLine("CSV文件写入成功!"); } } } catch (Exception ex) { MessageBox.Show("数据导出失败!error:" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } return; } private void skinButton1_Click(object sender, EventArgs e) { DataTable dt = (DataTable)dataGridView1.DataSource; if (dt.Rows.Count > 0) { SaveFileDialog fileDialog = new SaveFileDialog(); fileDialog.Filter = "数据文件(*.csv)|*.csv"; fileDialog.Title = "保存数据"; //保存对话框是否记忆上次打开的目录 fileDialog.RestoreDirectory = true; if (fileDialog.ShowDialog() == DialogResult.OK) { try { string filePath = fileDialog.FileName; // CSV文件路径 ShowAllDataTableEx(filePath); MessageBox.Show("数据导出成功!" , "完成", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show("数据导出失败!error:" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } #endregion private void btnClear_Click(object sender, EventArgs e) { cbProductCode.Text = ""; } } }