CNAS取数仪器端升级
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

4 месяцев назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200
  1. using CNAS_SerialPort;
  2. using CnasSynchronousCommon;
  3. using CnasSynchronusClient;
  4. using CnasSynchrousModel;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Data;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Windows.Forms;
  12. using System.Xml.Serialization;
  13. namespace CNAS_BalanceClient
  14. {
  15. public partial class frmBalanceMain : Form
  16. {
  17. private LaboratoryTestBLL laboratoryTestBLL = new LaboratoryTestBLL();
  18. private BalanceMainOperation operation = new BalanceMainOperation();
  19. private string currentDataType = "ARB";//ARB全水分;Moisture水分;Ash灰分;Volatile挥发分;Crucible坩埚;Heat发热量:Sulfur测硫;Hydrogen测氢
  20. private string currentCrucibleDataType = "Crucible|Heat";//坩埚称样数据类型(热量;硫;元素)
  21. private Dictionary<string, DataGridView> DstCrucibleGrids = new Dictionary<string, DataGridView>();
  22. private List<LaboratoryTest> laboratoryTests = new List<LaboratoryTest>(); //数据源
  23. private List<LaboratoryTest> cruciblelaboratoryTests = new List<LaboratoryTest>(); //坩埚数据样品编号类型(界面中左侧表单数据,不存储)
  24. private List<SyncBalanceItem> lstBalanceData = new List<SyncBalanceItem>(); //天平端映射字段相关信息
  25. private DataBaseInfo targetdataBase = new DataBaseInfo(); //cnas目标数据库
  26. private SerialPortConfigInfo serialPortConfig; //连接天平的串口的相关配置信息,从本地数据库中读取
  27. private List<string> lstReadTxt = new List<string>(); //天平传输过来的数据
  28. private double OldMad1Value = 0; //用于记录未开始编辑时的旧值,便于编辑出错后的返回
  29. private double OldMad2Value = 0; //用于记录未开始编辑时的旧值,便于编辑出错后的返回
  30. public frmBalanceMain()
  31. {
  32. InitializeComponent();
  33. //初始化各个datagridview控件
  34. InitializeDatagridview(dgvQuanShuiFen);
  35. InitializeDatagridview(dgvShuiFen);
  36. InitializeDatagridview(dgvHuiFen);
  37. InitializeDatagridview(dgvHuiFaFen);
  38. InitializeDatagridview(dgvWeighing);
  39. InitializeDatagridview(dgvCrucibleSulfur);
  40. InitializeDatagridview(dgvCrucibleElement);
  41. InitializeDatagridview(dgvCrucibleShelf);
  42. InitializeDatagridview(dgvShelfFind);
  43. if (GlobalCommonOperation.strUserName.Contains("admin"))
  44. {
  45. this.tsmMapping.Enabled = true;
  46. this.tsmPortConfig.Enabled = true;
  47. }
  48. else
  49. {
  50. this.tsmMapping.Enabled = false;
  51. this.tsmPortConfig.Enabled = false;
  52. }
  53. }
  54. private void frmBalanceMain_Load(object sender, EventArgs e)
  55. {
  56. //加载天平端字段信息
  57. lstBalanceData = FileOperation.GetLocalBalanceData();
  58. //加载CNAS数据库配置
  59. targetdataBase = FileOperation.GetLocalPlatFormDB();
  60. if (!CnasDataOperationFact.CnasDataOperation().TestConnect(targetdataBase))
  61. {
  62. this.lblCNASDb.Visible = true;
  63. this.lblCNASDb.Text = "CNAS数据库无法正常连接...";
  64. }
  65. else
  66. {
  67. this.lblCNASDb.Visible = false;
  68. }
  69. #region 注释------已经不再使用通过读取上次上传时间获取显示数据
  70. //从目标库的每个表中获取中读取上次上传的最大时间
  71. //Dictionary<string, string> dictMaxTime = new Dictionary<string, string>();
  72. //foreach (var item in lstBalanceData)
  73. //{
  74. // string strCompareTime = "";
  75. // var query = item.syncParamasInfos.Where(s => s.IfDateField == true).ToList<SyncParamasInfo>();
  76. // if (query.Count == 1)
  77. // {
  78. // DataTable dtTime = CnasDataOperationFact.CnasDataOperation().GetMaxTimeByTableName(targetdataBase, item.syncParamasInfos[0].TargetTable, query[0].TargetField);
  79. // if (dtTime == null || dtTime.Rows.Count <= 0)
  80. // {
  81. // strCompareTime = "2019-01-01";
  82. // }
  83. // else
  84. // strCompareTime = Convert.ToDateTime(dtTime.Rows[0][0].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
  85. // }
  86. // dictMaxTime.Add(GetLaboratoryValue(item.Type), strCompareTime);
  87. //}
  88. #endregion
  89. //从本地数据库中读取串口配置信息
  90. serialPortConfig = new SericalPortConfigBLL().GetSerialPortConfigInfo();
  91. //从本地数据库中读取所有数据
  92. laboratoryTests = laboratoryTestBLL.GetLaboratoryTestDataByNoUpLoad();
  93. if (laboratoryTests.Count <= 0) return;
  94. //绑定显示的datagridview
  95. BindData();
  96. //初始化后面常用的一个参数(避免频繁swtich)
  97. DstCrucibleGrids = new Dictionary<string, DataGridView>() {
  98. { "Crucible|Heat",dgvWeighing},
  99. { "Crucible|Sulfur",dgvCrucibleSulfur},
  100. { "Crucible|Hydrogen",dgvCrucibleElement}
  101. };
  102. }
  103. private void tabBalance_Selected(object sender, TabControlEventArgs e)
  104. {
  105. //ARB全水分;Moisture水分;Ash灰分;Volatile挥发分;Crucible坩埚;Heat发热量:Sulfur测硫;Hydrogen测氢
  106. operation.UpdateCurrentDataType(e, ref currentDataType);
  107. BindData();
  108. }
  109. private void tsbDelete_Click(object sender, EventArgs e)
  110. {
  111. DeleteData();
  112. }
  113. private void tsbSave_Click(object sender, EventArgs e)
  114. {
  115. //当前选项卡下的所有数据
  116. List<LaboratoryTest> currentquery = new List<LaboratoryTest>();
  117. if(currentDataType== "Crucible")
  118. currentquery = laboratoryTests.Where(s => s.DataType.StartsWith(currentDataType) && s.OperationType != null && s.OperationType != "").ToList<LaboratoryTest>();
  119. else
  120. currentquery = laboratoryTests.Where(s => s.DataType == currentDataType&&s.OperationType!=null&& s.OperationType != "").ToList<LaboratoryTest>();
  121. //执行存储
  122. ReturnValue<LaboratoryTest> returnValue=laboratoryTestBLL.SaveLaboratoryData(currentquery);
  123. if (returnValue.StrErrorMsg!=null&&returnValue.StrErrorMsg != "")
  124. {
  125. AppLog.Error($"未保存成功:{returnValue.StrErrorMsg}");
  126. MessageBox.Show(returnValue.StrErrorMsg, "提示");
  127. }
  128. else if (returnValue.StrMsg!=null&&returnValue.StrMsg != "")
  129. {
  130. MessageBox.Show(returnValue.StrMsg, "提示");
  131. //清空操作列的所有内容,避免重复操作
  132. //int deletecount=currentquery.RemoveAll(s => (s.OperationType != null && s.OperationType.ToLower() == "delete"));
  133. //foreach (var item in currentquery)
  134. //{
  135. // item.OperationType = "";
  136. //}
  137. foreach (var item in currentquery)
  138. {
  139. if (item.OperationType == null) continue;
  140. if (item.OperationType == "") continue;
  141. if (item.OperationType.ToLower() == "delete")
  142. {
  143. laboratoryTests.Remove(item);
  144. }
  145. else
  146. {
  147. item.OperationType = "";
  148. }
  149. }
  150. }
  151. }
  152. private void tsbAllSave_Click(object sender, EventArgs e)
  153. {
  154. //保存操作列不为空的数据行
  155. var currentquery = laboratoryTests.Where(s =>s.OperationType != null && s.OperationType != "").ToList<LaboratoryTest>();
  156. ReturnValue<LaboratoryTest> returnValue = laboratoryTestBLL.SaveLaboratoryData(currentquery);
  157. if (returnValue.StrErrorMsg != null && returnValue.StrErrorMsg != "")
  158. {
  159. MessageBox.Show(returnValue.StrErrorMsg, "提示");
  160. AppLog.Error($"未保存成功:{returnValue.StrErrorMsg}");
  161. }
  162. else if (returnValue.StrMsg != null && returnValue.StrMsg != "")
  163. {
  164. MessageBox.Show(returnValue.StrMsg, "提示");
  165. //清空操作列的所有内容,避免重复操作
  166. //int deletecount = currentquery.RemoveAll(s => (s.OperationType != null && s.OperationType.ToLower() == "delete"));
  167. //foreach (var item in currentquery)
  168. //{
  169. // item.OperationType = "";
  170. //}
  171. foreach (var item in currentquery)
  172. {
  173. if (item.OperationType == null) continue;
  174. if (item.OperationType == "") continue;
  175. if (item.OperationType.ToLower() == "delete")
  176. {
  177. laboratoryTests.Remove(item);
  178. }
  179. else
  180. {
  181. item.OperationType = "";
  182. }
  183. }
  184. }
  185. }
  186. private void tsbOpenPort_Click(object sender, EventArgs e)
  187. {
  188. try
  189. {
  190. if (sPortBalance.IsOpen)
  191. {
  192. sPortBalance.Close();
  193. tsbOpenPort.Text = "打开串口";
  194. lblPort.Text = "串口已关闭...";
  195. }
  196. else
  197. {
  198. sPortBalance.PortName = serialPortConfig.PortName;
  199. sPortBalance.BaudRate = serialPortConfig.BaudRate;
  200. sPortBalance.DataBits = serialPortConfig.DataBits;
  201. switch (serialPortConfig.Parity)
  202. {
  203. case "None":
  204. sPortBalance.Parity = System.IO.Ports.Parity.None;
  205. break;
  206. case "Odd":
  207. sPortBalance.Parity = System.IO.Ports.Parity.Odd;
  208. break;
  209. case "Even":
  210. sPortBalance.Parity = System.IO.Ports.Parity.Even;
  211. break;
  212. case "Mark":
  213. sPortBalance.Parity = System.IO.Ports.Parity.Mark;
  214. break;
  215. case "Space":
  216. sPortBalance.Parity = System.IO.Ports.Parity.Space;
  217. break;
  218. }
  219. switch (serialPortConfig.StopBits)
  220. {
  221. case "1":
  222. sPortBalance.StopBits = System.IO.Ports.StopBits.One;
  223. break;
  224. case "1.5":
  225. sPortBalance.StopBits = System.IO.Ports.StopBits.OnePointFive;
  226. break;
  227. case "2":
  228. sPortBalance.StopBits = System.IO.Ports.StopBits.Two;
  229. break;
  230. }
  231. switch (serialPortConfig.Handshake)
  232. {
  233. case "None":
  234. sPortBalance.Handshake = System.IO.Ports.Handshake.None;
  235. break;
  236. case "XOnXOff":
  237. sPortBalance.Handshake = System.IO.Ports.Handshake.XOnXOff;
  238. break;
  239. case "RequestToSend":
  240. sPortBalance.Handshake = System.IO.Ports.Handshake.RequestToSend;
  241. break;
  242. case "RequestToSendXOnXOff":
  243. sPortBalance.Handshake = System.IO.Ports.Handshake.RequestToSendXOnXOff;
  244. break;
  245. }
  246. sPortBalance.Open();
  247. tsbOpenPort.Text = "关闭串口";
  248. lblPort.Text = "串口已打开...";
  249. }
  250. }
  251. catch (Exception ex)
  252. {
  253. sPortBalance = new System.IO.Ports.SerialPort();
  254. System.Media.SystemSounds.Beep.Play();
  255. tsbOpenPort.Text = "打开串口";
  256. lblPort.Text = "串口已关闭...";
  257. MessageBox.Show(ex.Message, "提示");
  258. AppLog.Error($"打开串口失败:{ex.Message}");
  259. }
  260. }
  261. private void sPortBalance_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  262. {
  263. //读取缓冲区三次数据,类似{N +} {0.0000}{ g},这里只要第二部分的内容
  264. try
  265. {
  266. //读取数据
  267. //Invoke((EventHandler)(delegate
  268. //{
  269. // string strReadTxt = sPortBalance.ReadExisting();
  270. // //if (strReadTxt.StartsWith("N"))
  271. // //{
  272. // // lstReadTxt.Clear();
  273. // //}
  274. // //lstReadTxt.Add(strReadTxt);
  275. // //if (lstReadTxt.Count == 3)
  276. // //{
  277. // // UpdateBalanceValue(lstReadTxt[1]);
  278. // //}
  279. // UpdateBalanceValue(strReadTxt);
  280. //}
  281. // )
  282. // );
  283. string strReceiveData = SerialPortDataReceive.ReceivePortData(this, sPortBalance, lstReadTxt);
  284. if(strReceiveData!="")
  285. UpdateBalanceValue(strReceiveData);
  286. }
  287. catch (Exception ex)
  288. {
  289. AppLog.Error($"接收数据失败:{ex.Message}");
  290. throw ex;
  291. }
  292. }
  293. /// <summary>
  294. /// 初始化datagridview(补充)
  295. /// </summary>
  296. /// <param name="dgv"></param>
  297. private void InitializeDatagridview(DataGridView dgv)
  298. {
  299. dgv.AutoGenerateColumns = false;
  300. }
  301. /// <summary>
  302. /// 选中最后一行
  303. /// </summary>
  304. private void SelectLastRow()
  305. {
  306. //ARB 全水分;Moisture 水分;Ash 灰分;Volatile 挥发分;Crucible 坩埚;Heat 发热量:Sulfur 测硫;Hydrogen 测氢
  307. switch (currentDataType)
  308. {
  309. case "ARB":
  310. dgvQuanShuiFen.CurrentCell = dgvQuanShuiFen.Rows[dgvQuanShuiFen.Rows.Count - 1].Cells[1];
  311. break;
  312. case "Moisture":
  313. dgvShuiFen.CurrentCell = dgvShuiFen.Rows[dgvShuiFen.Rows.Count - 1].Cells[1];
  314. break;
  315. case "Ash":
  316. dgvHuiFen.CurrentCell = dgvHuiFen.Rows[dgvHuiFen.Rows.Count - 1].Cells[1];
  317. break;
  318. case "Volatile":
  319. dgvHuiFaFen.CurrentCell = dgvHuiFaFen.Rows[dgvHuiFaFen.Rows.Count - 1].Cells[1];
  320. break;
  321. }
  322. }
  323. /// <summary>
  324. /// 绑定数据
  325. /// </summary>
  326. private void BindData()
  327. {
  328. try
  329. {
  330. //ARB 全水分;Moisture 水分;Ash 灰分;Volatile 挥发分;Crucible 坩埚;Heat 发热量:Sulfur 测硫;Hydrogen 测氢
  331. switch (currentDataType)
  332. {
  333. case "ARB":
  334. operation.BindData(dgvQuanShuiFen, laboratoryTests, currentDataType);
  335. break;
  336. case "Moisture":
  337. operation.BindData(dgvShuiFen, laboratoryTests, currentDataType);
  338. break;
  339. case "Ash":
  340. operation.BindData(dgvHuiFen, laboratoryTests, currentDataType);
  341. break;
  342. case "Volatile":
  343. operation.BindData(dgvHuiFaFen, laboratoryTests, currentDataType);
  344. break;
  345. case "Crucible":
  346. BindCrucibleData();
  347. break;
  348. case "Heat":
  349. break;
  350. case "Sulfur":
  351. break;
  352. case "Hydrogen":
  353. break;
  354. }
  355. }
  356. catch (Exception ex)
  357. {
  358. AppLog.Error("删除数据时出错:" + ex.Message.ToString());
  359. }
  360. }
  361. /// <summary>
  362. /// 删除数据
  363. /// </summary>
  364. private void DeleteData()
  365. {
  366. try
  367. {
  368. switch (currentDataType)
  369. {
  370. case "ARB":
  371. operation.DeleteData(dgvQuanShuiFen, laboratoryTests, currentDataType);
  372. break;
  373. case "Moisture":
  374. operation.DeleteData(dgvShuiFen, laboratoryTests, currentDataType);
  375. break;
  376. case "Ash":
  377. operation.DeleteData(dgvHuiFen, laboratoryTests, currentDataType);
  378. break;
  379. case "Volatile":
  380. operation.DeleteData(dgvHuiFaFen, laboratoryTests, currentDataType);
  381. break;
  382. }
  383. }
  384. catch (Exception ex)
  385. {
  386. AppLog.Error("删除数据时出错:"+ex.Message.ToString());
  387. }
  388. }
  389. private void tsmMapping_Click(object sender, EventArgs e)
  390. {
  391. frmBalanceField frmBalanceField = new frmBalanceField(lstBalanceData,targetdataBase);
  392. if (frmBalanceField.ShowDialog() == DialogResult.OK)
  393. {
  394. this.lstBalanceData = frmBalanceField.syncBalanceItems;
  395. }
  396. }
  397. /// <summary>
  398. /// 上传数据
  399. /// </summary>
  400. /// <param name="sender"></param>
  401. /// <param name="e"></param>
  402. private void tsbUpload_Click(object sender, EventArgs e)
  403. {
  404. //1.确定当前准备上传的数据(只上传选中部分)
  405. AppLog.Info("获取当前选中数据");
  406. List<string> lstSelectID = new List<string>();
  407. //ARB 全水分;Moisture 水分;Ash 灰分;Volatile 挥发分;Crucible 坩埚;Heat 发热量:Sulfur 测硫;Hydrogen 测氢
  408. switch (currentDataType)
  409. {
  410. case "ARB":
  411. lstSelectID = operation.GetSelectItemID(dgvQuanShuiFen);
  412. break;
  413. case "Moisture":
  414. lstSelectID = operation.GetSelectItemID(dgvShuiFen);
  415. break;
  416. case "Ash":
  417. lstSelectID = operation.GetSelectItemID(dgvHuiFen);
  418. break;
  419. case "Volatile":
  420. lstSelectID = operation.GetSelectItemID(dgvHuiFaFen);
  421. break;
  422. }
  423. if (lstSelectID.Count <= 0)
  424. {
  425. AppLog.Info("未选中任何一条化验数据。上传结束。");
  426. MessageBox.Show("请至少选择一条化验数据进行上传。", "提示");
  427. return;
  428. }
  429. //找到当前上传的是对应化验项目的字段配置
  430. var currentbalanceconfig = lstBalanceData.Where(x => GetLaboratoryValue(x.Type) == currentDataType).ToList<SyncBalanceItem>();
  431. if (currentbalanceconfig.Count <= 0)
  432. {
  433. MessageBox.Show("请先配置上传映射字段。", "提示");
  434. return;
  435. }
  436. else
  437. {
  438. //检查配置的字段映射是否满足条件
  439. if (currentbalanceconfig[0].syncParamasInfos.Count <= 0)
  440. {
  441. MessageBox.Show("请先配置上传映射字段。", "提示");
  442. return;
  443. }
  444. }
  445. List<DataRow> lstError = new List<DataRow>();
  446. int ErrorCount = 0;
  447. int SuccessCount = 0;
  448. int OtherCount = 0;
  449. //foreach (var banlanceitem in currentbalanceconfig)
  450. SyncBalanceItem banlanceitem = currentbalanceconfig[0];
  451. //如果字段配置项目不跟当前界面展示的化验项目一致,跳过
  452. if (currentDataType != GetLaboratoryValue(banlanceitem.Type)) return;
  453. //获取准备上传到数据库表结构
  454. AppLog.Info("获取准备上传到数据库表结构");
  455. DataTable dtTarget = CnasDataOperationFact.CnasDataOperation().GetCNASTablesStruct(banlanceitem.syncParamasInfos[0].TargetTable, targetdataBase);
  456. //将上传数据转换为上传数据的形式
  457. AppLog.Info("将上传数据转换为上传数据格式");
  458. string strErrorMsg = "";
  459. bool bSuccess = true;
  460. List<string> lstSuccessID = new List<string>();
  461. CnasInsertOperation insertOperation = new CnasInsertOperation();
  462. var query = laboratoryTests.Where(s => s.DataType == GetLaboratoryValue(banlanceitem.Type)).ToList<LaboratoryTest>();
  463. foreach (var laboratoryitem in query)
  464. {
  465. if (!lstSelectID.Contains(laboratoryitem.GUID)) continue;
  466. bSuccess = true;
  467. DataRow drNewTarget = dtTarget.NewRow();
  468. //遍历映射表,把所有字段插入到目标表中
  469. foreach (var item in banlanceitem.syncParamasInfos)
  470. {
  471. var strSourceField = item.SourceField;
  472. var strTargetField = item.TargetField;
  473. //当列名存在于数据表中时才能继续
  474. int i = laboratoryitem.GetType().GetProperties().Where(sb => sb.Name== strSourceField).Count();
  475. if (laboratoryitem.GetType().GetProperties().Where(sb => sb.Name== strSourceField).Count() > 0 && dtTarget.Columns.Contains(strTargetField))
  476. {
  477. strErrorMsg = TestConvertValueToTarget(drNewTarget, laboratoryitem, strTargetField, strSourceField);
  478. if (strErrorMsg != "")
  479. {
  480. MessageBox.Show(string.Format("发生数据转换错误,请重新配置映射字段或修改字段值。错误信息如下:列【{0}】,值【{1}】,详情【{2}】", strSourceField, laboratoryitem.GetType().GetProperty(strSourceField).GetValue(laboratoryitem, null), strErrorMsg), "提示");
  481. break;
  482. }
  483. }
  484. }
  485. if (strErrorMsg != "")
  486. {
  487. bSuccess = false;
  488. break;
  489. }
  490. //字段长度约束检测
  491. AppLog.Info("检查上传数据合法性");
  492. if (!CheckInputDatallegal(ConvertDataRowToTable(drNewTarget), banlanceitem))
  493. {
  494. bSuccess = false;
  495. break;
  496. }
  497. //检查仪器标识列信息
  498. if (dtTarget.Columns.Contains(banlanceitem.CnasInstrumentColumn))
  499. drNewTarget[banlanceitem.CnasInstrumentColumn] = banlanceitem.GUID;
  500. else
  501. {
  502. MessageBox.Show("设置的CNAS仪器信息列没有在库中找到。","提示" );
  503. bSuccess = false;
  504. break;
  505. }
  506. //根据固定值字段塞入数据到数据行
  507. AppLog.Info("条件映射数据更改");
  508. foreach (var item in banlanceitem.lstFixedValue)
  509. {
  510. if (dtTarget.Columns.Contains(item.ColumnName))
  511. {
  512. switch (item.Condition)
  513. {
  514. case MapCondition.Equal:
  515. drNewTarget[item.ColumnName] = item.Value;
  516. break;
  517. }
  518. }
  519. }
  520. //执行插入一条数据
  521. AppLog.Info("执行上传单条数据");
  522. int iReturn = CnasDataOperationFact.CnasDataOperation().InsertDataToCNASTable(ConvertDataRowToTable(drNewTarget), targetdataBase, banlanceitem.syncParamasInfos, banlanceitem.CnasInstrumentColumn,banlanceitem.lstFixedValue);
  523. if (iReturn <= 0) //此时出现问题
  524. {
  525. if (iReturn == -1)
  526. {
  527. AppLog.ServiceInfo("数据库连接中断,终止本次上传。");
  528. break; //此时数据库连接中断,直接跳出循环,结束本次数据同步传输
  529. }
  530. else if (iReturn == -2) //等于-2表示插入准备更新时发现数据一致,不再执行
  531. {
  532. OtherCount++;
  533. }
  534. else
  535. {
  536. ErrorCount++;
  537. /*需要转换一下,否则会将整个dt全部写入日志*/
  538. lstError.Add(GlobalCommonOperation.ConvertDataRowToTable(drNewTarget).Rows[0]);
  539. }
  540. bSuccess = false;
  541. }
  542. else //此时没有出现问题,1.如果本条数据未保存,将本条数据保存;2.向上传数据记录表中插入一条数据
  543. {
  544. SuccessCount++;
  545. //存储化验数据到本地
  546. if (!string.IsNullOrEmpty(laboratoryitem.OperationType))
  547. {
  548. ReturnValue<LaboratoryTest> returnValue = laboratoryTestBLL.SaveLaboratoryData(laboratoryitem);
  549. if (!string.IsNullOrEmpty(returnValue.StrErrorMsg))
  550. {
  551. //写入日志
  552. AppLog.Error("上传完成后,没能正常存储数据到本地:" + returnValue.StrErrorMsg);
  553. }
  554. }
  555. //存储化验数据到化验记录表
  556. UpLoadRecordBLL upLoadRecord = new UpLoadRecordBLL();
  557. int ireturn=upLoadRecord.AddRecordToDatabase(
  558. new UpLoadRecord()
  559. {
  560. GUID = Guid.NewGuid().ToString(),
  561. LaboratoryTestGUID = laboratoryitem.GUID,
  562. UpLoadUser = GlobalCommonOperation.strUserName,
  563. UpLoadTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm"))
  564. }
  565. );
  566. if (ireturn <= 0)
  567. {
  568. //写入日志
  569. AppLog.Error($"上传完成后,没能正常存储上传记录数据到本地:LaboratoryTestGUID={laboratoryitem.GUID},UpLoadUser={GlobalCommonOperation.strUserName},UpLoadTime={Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm"))}");
  570. }
  571. AppLog.Info("执行上传单条数据完成");
  572. }
  573. if (bSuccess) //说明在整个上传过程中没有发生错误
  574. {
  575. if(!lstSuccessID.Contains(laboratoryitem.GUID)) lstSuccessID.Add(laboratoryitem.GUID);
  576. }
  577. }
  578. MessageBox.Show($"上传操作完成!其中成功{SuccessCount}条,失败{ErrorCount}条,其他{OtherCount}条。");
  579. //数据源中清空已经上传的项
  580. if (lstSuccessID.Count >= 0)
  581. {
  582. foreach (var item in lstSuccessID)
  583. {
  584. laboratoryTests.RemoveAll(s => s.GUID == item);
  585. }
  586. BindData();
  587. }
  588. }
  589. public bool CheckInputDatallegal(DataTable dtTarget,SyncBalanceItem banlanceitem)
  590. {
  591. bool bIfSuccess = true;
  592. CnasDataCheck check = new CnasDataCheck
  593. {
  594. DtReadyInsert = dtTarget,
  595. TargetDataBase = targetdataBase,
  596. StrTableName = banlanceitem.syncParamasInfos[0].TargetTable
  597. };
  598. check.CheckData();
  599. if (check.LstIllegalMsg != null && check.LstIllegalMsg.Count > 0)
  600. {
  601. var item = banlanceitem.syncParamasInfos.Where(s => s.TargetField == check.LstIllegalMsg[0].ColumnName).ToList<SyncParamasInfo>();
  602. if (item.Count == 1)
  603. {
  604. MessageBox.Show(string.Format("数据不满足上传条件,请修改后再上传。错误数据:当前列名【{0}】,列值【{1}】", item[0].SourceField, check.LstIllegalMsg[0].ColumnValue), "提示");
  605. bIfSuccess = false;
  606. }
  607. else
  608. {
  609. MessageBox.Show(string.Format("数据不满足上传条件,请修改后再上传。错误数据:CNAS列名【{0}】,列值【{1}】", check.LstIllegalMsg[0].ColumnName, check.LstIllegalMsg[0].ColumnValue), "提示");
  610. bIfSuccess = false;
  611. }
  612. }
  613. return bIfSuccess;
  614. }
  615. private string TestConvertValueToTarget(DataRow drTarget, LaboratoryTest laboratory, string strTargetColumn, string strSourceColumn)
  616. {
  617. string strErrorMsg = "";
  618. try
  619. {
  620. drTarget[strTargetColumn] = laboratory.GetType().GetProperty(strSourceColumn).GetValue(laboratory, null);
  621. }
  622. catch (Exception ex)
  623. {
  624. strErrorMsg = ex.Message;
  625. AppLog.Error(strErrorMsg);
  626. }
  627. return strErrorMsg;
  628. }
  629. private DataTable ConvertDataRowToTable(DataRow dr)
  630. {
  631. DataTable dt = dr.Table.Clone();
  632. DataRow drNew = dt.NewRow();
  633. drNew.ItemArray = dr.ItemArray;
  634. dt.Rows.Add(drNew);
  635. return dt;
  636. }
  637. private string GetLaboratoryValue(string strShowName)
  638. {
  639. string strReturn = "";
  640. switch (strShowName)
  641. {
  642. case "全水分":
  643. strReturn = "ARB";
  644. break;
  645. case "水分":
  646. strReturn = "Moisture";
  647. break;
  648. case "灰分":
  649. strReturn = "Ash";
  650. break;
  651. case "挥发分":
  652. strReturn = "Volatile";
  653. break;
  654. }
  655. return strReturn;
  656. }
  657. /// <summary>
  658. /// 此时新增一条样品化验记录
  659. /// </summary>
  660. /// <param name="sender"></param>
  661. /// <param name="e"></param>
  662. private void btnCodeOK_Click(object sender, EventArgs e)
  663. {
  664. //判断化验编号是否合法
  665. if (this.txtCode.Text.Trim().Length <= 0)
  666. {
  667. MessageBox.Show("当条码为空时不能新增化验记录", "提示");
  668. return;
  669. }
  670. //根据当前Tab页,增加新的数据
  671. ReturnValue<LaboratoryTest> returnValue=operation.AddNewData(this.txtCode.Text.Trim(),currentDataType);
  672. if ((returnValue.StrErrorMsg == null || returnValue.StrErrorMsg == "") && returnValue.LstValue.Count == 1)
  673. {
  674. //填充自动编码数据
  675. returnValue.LstValue[0].Auto_Code = operation.GetAutoCode(laboratoryTests);
  676. //显示页中新增一条数据
  677. laboratoryTests.Add(returnValue.LstValue[0]);
  678. BindData();
  679. //选中最后一行
  680. SelectLastRow();
  681. }
  682. else
  683. {
  684. MessageBox.Show("新增数据时出错:"+returnValue.StrErrorMsg, "提示");
  685. AppLog.Error("新增数据时出错:" + returnValue.StrErrorMsg);
  686. }
  687. }
  688. /// <summary>
  689. /// 将天平端传入的值传入当前显示界面
  690. /// </summary>
  691. /// <param name="strValue"></param>
  692. private void UpdateBalanceValue(string strValue)
  693. {
  694. try
  695. {
  696. AppLog.Info($"接收串口信息:{strValue}");
  697. double defaultdouble = 0;
  698. if (double.TryParse(strValue, out defaultdouble)) //接收到的数据必须可以转换成数字
  699. {
  700. List<string> lstIndex = new List<string>();
  701. //ARB 全水分;Moisture 水分;Ash 灰分;Volatile 挥发分;Crucible 坩埚;Heat 发热量:Sulfur 测硫;Hydrogen 测氢
  702. //全水分,水分,灰分天平端上传列相同,使用同一个方法。
  703. switch (currentDataType)
  704. {
  705. case "ARB":
  706. operation.UpdateQuanShuiFenBalanceWeight(dgvQuanShuiFen, lstIndex, defaultdouble, laboratoryTests, currentDataType);
  707. break;
  708. case "Moisture":
  709. operation.UpdateQuanShuiFenBalanceWeight(dgvShuiFen, lstIndex, defaultdouble, laboratoryTests, currentDataType);
  710. break;
  711. case "Ash":
  712. operation.UpdateQuanShuiFenBalanceWeight(dgvHuiFen, lstIndex, defaultdouble, laboratoryTests, currentDataType);
  713. break;
  714. case "Volatile":
  715. operation.UpdateVolatileBalanceWeight(dgvHuiFaFen, lstIndex, defaultdouble, laboratoryTests);
  716. break;
  717. case "Crucible":
  718. operation.UpdateCrucibleBalanceWeight(DstCrucibleGrids, dgvCrucibleShelf, defaultdouble, currentCrucibleDataType, laboratoryTests);
  719. break;
  720. }
  721. }
  722. }
  723. catch (Exception ex)
  724. {
  725. MessageBox.Show("无法正常插入天平值," + ex.Message, "提示");
  726. AppLog.Error("无法正常插入天平值," + ex.Message);
  727. }
  728. }
  729. #region 绘制序号列
  730. private void dgvQuanShuiFen_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  731. {
  732. operation.DrawFirstColumnIndex(dgvQuanShuiFen,e);
  733. }
  734. private void dgvShuiFen_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  735. {
  736. operation.DrawFirstColumnIndex(dgvShuiFen, e);
  737. }
  738. private void dgvHuiFen_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  739. {
  740. operation.DrawFirstColumnIndex(dgvHuiFen, e);
  741. }
  742. private void dgvHuiFaFen_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  743. {
  744. operation.DrawFirstColumnIndex(dgvHuiFaFen, e);
  745. }
  746. private void dgvWeighing_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  747. {
  748. operation.DrawFirstColumnIndex(dgvWeighing, e);
  749. }
  750. private void dgvCrucibleSulfur_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  751. {
  752. operation.DrawFirstColumnIndex(dgvCrucibleSulfur, e);
  753. }
  754. private void dgvCrucibleElement_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  755. {
  756. operation.DrawFirstColumnIndex(dgvCrucibleElement, e);
  757. }
  758. private void dgvCrucibleShelf_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  759. {
  760. operation.DrawFirstColumnIndex(dgvCrucibleShelf, e);
  761. }
  762. private void dgvShelfFind_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  763. {
  764. operation.DrawFirstColumnIndex(dgvShelfFind, e);
  765. }
  766. #endregion
  767. #region 编辑提交仪器编号,坩埚号
  768. private void dgvQuanShuiFen_CellEndEdit(object sender, DataGridViewCellEventArgs e)
  769. {
  770. operation.CommitEditColumn(dgvQuanShuiFen, laboratoryTests, e);
  771. }
  772. private void dgvShuiFen_CellEndEdit(object sender, DataGridViewCellEventArgs e)
  773. {
  774. operation.CommitEditColumn(dgvShuiFen, laboratoryTests, e);
  775. if (dgvShuiFen.CurrentCell == null) return;
  776. if (dgvShuiFen.CurrentCell.Value == null) return;
  777. if (e.ColumnIndex == 11) //MAD编号
  778. {
  779. string strInputValue = dgvShuiFen.CurrentCell.Value.ToString();
  780. string strCurrentID = dgvShuiFen.Rows[dgvShuiFen.CurrentCell.RowIndex].Cells[0].Value.ToString();
  781. var query = laboratoryTests.Where(s => s.GUID == strCurrentID).ToList<LaboratoryTest>();
  782. if (query.Count == 1)
  783. {
  784. if (operation.CheckInputPercent(strInputValue))
  785. {
  786. query[0].Mad = Convert.ToDouble(strInputValue);
  787. if (query[0].OperationType == null || query[0].OperationType == "")
  788. query[0].OperationType = "update";
  789. }
  790. else
  791. {
  792. //将显示值改回初始值
  793. dgvShuiFen.CurrentCell.Value = OldMad1Value;
  794. }
  795. }
  796. }
  797. }
  798. private void dgvHuiFen_CellEndEdit(object sender, DataGridViewCellEventArgs e)
  799. {
  800. operation.CommitEditColumn(dgvHuiFen, laboratoryTests, e);
  801. }
  802. private void dgvHuiFaFen_CellEndEdit(object sender, DataGridViewCellEventArgs e)
  803. {
  804. operation.CommitEditColumn(dgvHuiFaFen, laboratoryTests, e);
  805. if (dgvHuiFaFen.CurrentCell == null) return;
  806. if (dgvHuiFaFen.CurrentCell.Value == null) return;
  807. if (e.ColumnIndex == 9) //MAD编号
  808. {
  809. string strInputValue = dgvHuiFaFen.CurrentCell.Value.ToString();
  810. string strCurrentID = dgvHuiFaFen.Rows[dgvHuiFaFen.CurrentCell.RowIndex].Cells[0].Value.ToString();
  811. var query = laboratoryTests.Where(s => s.GUID == strCurrentID).ToList<LaboratoryTest>();
  812. if (query.Count == 1)
  813. {
  814. if (operation.CheckInputPercent(strInputValue))
  815. {
  816. query[0].Mad = Convert.ToDouble(strInputValue);
  817. if (query[0].OperationType == null || query[0].OperationType == "")
  818. query[0].OperationType = "update";
  819. }
  820. else
  821. {
  822. //将显示值改回初始值
  823. dgvHuiFaFen.CurrentCell.Value = OldMad2Value;
  824. }
  825. }
  826. }
  827. if (e.ColumnIndex == 11) //焦特征
  828. {
  829. string strInputValue = dgvHuiFaFen.CurrentCell.Value.ToString();
  830. string strCurrentID = dgvHuiFaFen.Rows[dgvHuiFaFen.CurrentCell.RowIndex].Cells[0].Value.ToString();
  831. var query = laboratoryTests.Where(s => s.GUID == strCurrentID).ToList<LaboratoryTest>();
  832. if (query.Count == 1)
  833. {
  834. query[0].Cinder_Characteristics = strInputValue;
  835. if (query[0].OperationType == null || query[0].OperationType == "")
  836. query[0].OperationType = "update";
  837. }
  838. }
  839. }
  840. #endregion
  841. private void btnAddReady_Click(object sender, EventArgs e)
  842. {
  843. //在左侧增加一条数据
  844. //判断化验编号是否合法
  845. string strSampleCode = this.txtSampleCode.Text.Trim();
  846. if (this.txtSampleCode.Text.Trim().Length <= 0)
  847. {
  848. MessageBox.Show("样品编码不能为空!", "提示");
  849. return;
  850. }
  851. //存在相同样品编码的化验数据,处理相同名称
  852. int index = 1;
  853. while (true)
  854. {
  855. var query = cruciblelaboratoryTests.Where(s => s.Sample_Number == strSampleCode && s.DataType == currentCrucibleDataType).Count();
  856. if (query > 0)
  857. {
  858. strSampleCode = this.txtSampleCode.Text.Trim() + "_" + index;
  859. index++;
  860. }
  861. else
  862. {
  863. break;
  864. }
  865. }
  866. //根据当前Tab页,增加新的数据
  867. ReturnValue<LaboratoryTest> returnValue = operation.AddNewData(strSampleCode, currentCrucibleDataType);
  868. if ((returnValue.StrErrorMsg == null || returnValue.StrErrorMsg == "") && returnValue.LstValue.Count == 1)
  869. {
  870. //填充自动编码数据
  871. returnValue.LstValue[0].Auto_Code = operation.GetAutoCode(laboratoryTests);
  872. //显示页中新增一条数据
  873. cruciblelaboratoryTests.Add(returnValue.LstValue[0]);
  874. //绑定
  875. BindCrucibleData();
  876. }
  877. }
  878. /// <summary>
  879. /// 绑定坩埚侧数据
  880. /// </summary>
  881. private void BindCrucibleData()
  882. {
  883. operation.BindCrucibleData(DstCrucibleGrids[currentCrucibleDataType], cruciblelaboratoryTests, currentCrucibleDataType);
  884. }
  885. private void tabCrucibleType_Selected(object sender, TabControlEventArgs e)
  886. {
  887. switch (e.TabPage.Name)
  888. {
  889. case "tabHeatValue":
  890. currentCrucibleDataType = "Crucible|Heat";
  891. break;
  892. case "tabSulfurValue":
  893. currentCrucibleDataType = "Crucible|Sulfur";
  894. break;
  895. case "tabElementAynic":
  896. currentCrucibleDataType = "Crucible|Hydrogen";
  897. break;
  898. }
  899. BindCrucibleData();
  900. //需要清空右侧列表,避免发生错误输入
  901. dgvCrucibleShelf.Rows.Clear();
  902. }
  903. private void btnCrucible_A_Click(object sender, EventArgs e)
  904. {
  905. operation.AddCrucibleShelfData(DstCrucibleGrids, dgvCrucibleShelf,currentCrucibleDataType,"A",laboratoryTests);
  906. }
  907. private void btnCrucible_B_Click(object sender, EventArgs e)
  908. {
  909. operation.AddCrucibleShelfData(DstCrucibleGrids, dgvCrucibleShelf, currentCrucibleDataType, "B", laboratoryTests);
  910. }
  911. private void btnCrucible_C_Click(object sender, EventArgs e)
  912. {
  913. operation.AddCrucibleShelfData(DstCrucibleGrids, dgvCrucibleShelf, currentCrucibleDataType, "C", laboratoryTests);
  914. }
  915. private void btnCrucible_D_Click(object sender, EventArgs e)
  916. {
  917. operation.AddCrucibleShelfData(DstCrucibleGrids, dgvCrucibleShelf, currentCrucibleDataType, "D", laboratoryTests);
  918. }
  919. private void tabShelf_Selected(object sender, TabControlEventArgs e)
  920. {
  921. //清空坩埚架数据
  922. dgvCrucibleShelf.Rows.Clear();
  923. }
  924. private void tsbHistory_Click(object sender, EventArgs e)
  925. {
  926. new frmHistory().Show();
  927. }
  928. private void btnFind_Click(object sender, EventArgs e)
  929. {
  930. try
  931. {
  932. List<LaboratoryTest> lstFilterData = new List<LaboratoryTest>();
  933. string strWeighingType = currentCrucibleDataType == "Crucible|Heat" ? "FRL" : (currentCrucibleDataType == "Crucible|Sulfur" ? "CLY" : "CHN");
  934. lstFilterData = laboratoryTests.Where(s => s.WeighingType == strWeighingType).ToList<LaboratoryTest>();
  935. if (dtpEndDate.Value >= dtpStartTime.Value)
  936. lstFilterData = lstFilterData.Where(s => s.OperaDateTime != null && s.OperaDateTime > dtpStartTime.Value && s.OperaDateTime < dtpEndDate.Value).ToList<LaboratoryTest>();
  937. if (this.txtShelfFind.Text.Trim() != "")
  938. lstFilterData = lstFilterData.Where(s => s.Sample_Number == this.txtShelfFind.Text.Trim()).ToList<LaboratoryTest>();
  939. dgvShelfFind.DataSource = new BindingList<LaboratoryTest>();
  940. dgvShelfFind.DataSource = new BindingList<LaboratoryTest>(lstFilterData);
  941. }
  942. catch (Exception ex)
  943. {
  944. MessageBox.Show("查找时发生错误:" + ex.Message, "提示");
  945. AppLog.Error("查找时发生错误:" + ex.Message);
  946. }
  947. }
  948. private void dgvQuanShuiFen_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
  949. {
  950. if (e.ColumnIndex == 10)//百分比字段
  951. {
  952. new QuanShuiFenUIOperation().UpdateARBPercentColumn(dgvQuanShuiFen, laboratoryTests,e.RowIndex);
  953. }
  954. }
  955. private void dgvShuiFen_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
  956. {
  957. if (e.ColumnIndex == 10) //减量,百分比字段更新
  958. {
  959. new ShuiFenUIOperation().UpdateMoisturePercentColumn(dgvShuiFen, laboratoryTests, e.RowIndex);
  960. }
  961. }
  962. private void dgvHuiFen_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
  963. {
  964. if (e.ColumnIndex == 10) //减量,百分比字段更新
  965. {
  966. new HuiFenUIOperation().UpdateAshPercentColumn(dgvHuiFen, laboratoryTests, e.RowIndex);
  967. }
  968. }
  969. private void dgvHuiFaFen_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
  970. {
  971. if (e.ColumnIndex == 10) //减量,百分比字段更新
  972. {
  973. new HuiFaFenUIOperation().UpdateVolatilePercentColumn(dgvHuiFaFen, laboratoryTests, e.RowIndex);
  974. }
  975. }
  976. private void dgvShuiFen_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
  977. {
  978. if (e.ColumnIndex == 11) //MAD编号
  979. {
  980. string strCurrentID = dgvShuiFen.Rows[dgvShuiFen.CurrentCell.RowIndex].Cells[0].Value.ToString();
  981. var query = laboratoryTests.Where(s => s.GUID == strCurrentID).ToList<LaboratoryTest>();
  982. if (query.Count == 1)
  983. {
  984. OldMad1Value = query[0].Mad;
  985. }
  986. }
  987. }
  988. private void dgvHuiFaFen_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
  989. {
  990. if (e.ColumnIndex == 9) //MAD编号
  991. {
  992. string strCurrentID = dgvHuiFaFen.Rows[dgvHuiFaFen.CurrentCell.RowIndex].Cells[0].Value.ToString();
  993. var query = laboratoryTests.Where(s => s.GUID == strCurrentID).ToList<LaboratoryTest>();
  994. if (query.Count == 1)
  995. {
  996. OldMad2Value = query[0].Mad;
  997. }
  998. }
  999. }
  1000. private void dgvShuiFen_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
  1001. {
  1002. if (dgvShuiFen.CurrentCell.ColumnIndex == 11) //MAD列,手动输入只能是数字或百分比
  1003. {
  1004. e.Control.KeyPress -= new KeyPressEventHandler(EditingControl_KeyPress);
  1005. e.Control.KeyPress += new KeyPressEventHandler(EditingControl_KeyPress);
  1006. }
  1007. }
  1008. private void dgvHuiFaFen_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
  1009. {
  1010. if (dgvHuiFaFen.CurrentCell.ColumnIndex == 9) //MAD列,手动输入只能是数字或百分比
  1011. {
  1012. e.Control.KeyPress -= new KeyPressEventHandler(EditingControl_KeyPress);
  1013. e.Control.KeyPress += new KeyPressEventHandler(EditingControl_KeyPress);
  1014. }
  1015. }
  1016. private void EditingControl_KeyPress(object sender, KeyPressEventArgs e)
  1017. {
  1018. if (e.KeyChar != 8 && !Char.IsDigit(e.KeyChar) && e.KeyChar != '.')
  1019. {
  1020. e.Handled = true;
  1021. MessageBox.Show("请输入数字与小数点", "提示");
  1022. }
  1023. }
  1024. //用户catch发生的错误
  1025. private void dgvShuiFen_DataError(object sender, DataGridViewDataErrorEventArgs e)
  1026. {
  1027. }
  1028. //用户catch发生的错误
  1029. private void dgvHuiFaFen_DataError(object sender, DataGridViewDataErrorEventArgs e)
  1030. {
  1031. }
  1032. private void btnDeleteShelf_Click(object sender, EventArgs e)
  1033. {
  1034. //当前选中项i
  1035. if (dgvCrucibleShelf.CurrentCell == null) return;
  1036. if (dgvCrucibleShelf.Rows[dgvCrucibleShelf.CurrentCell.RowIndex].Cells[0].Value == null) return;
  1037. string strID = dgvCrucibleShelf.Rows[dgvCrucibleShelf.CurrentCell.RowIndex].Cells[0].Value.ToString();
  1038. //删除数据源数据
  1039. var queryitem = laboratoryTests.Where(s => s.GUID == strID).ToList<LaboratoryTest>();
  1040. if (queryitem.Count == 1)
  1041. {
  1042. queryitem[0].OperationType = "delete";
  1043. //删除显示数据
  1044. dgvCrucibleShelf.Rows[dgvCrucibleShelf.CurrentCell.RowIndex].Cells["Shelf_ID"].Value = "";
  1045. dgvCrucibleShelf.Rows[dgvCrucibleShelf.CurrentCell.RowIndex].Cells["Shelf_SampleNumber"].Value = "";
  1046. dgvCrucibleShelf.Rows[dgvCrucibleShelf.CurrentCell.RowIndex].Cells["Shelf_WeighingType"].Value = "";
  1047. dgvCrucibleShelf.Rows[dgvCrucibleShelf.CurrentCell.RowIndex].Cells["Shelf_SampleWeight"].Value = "";
  1048. dgvCrucibleShelf.Rows[dgvCrucibleShelf.CurrentCell.RowIndex].Cells["Shelf_Operator"].Value = "";
  1049. }
  1050. }
  1051. private void tsmPortConfig_Click(object sender, EventArgs e)
  1052. {
  1053. frmConfigPort frmConfig = new frmConfigPort(serialPortConfig);
  1054. if (frmConfig.ShowDialog() == DialogResult.OK)
  1055. {
  1056. this.serialPortConfig = frmConfig.serialPortConfig;
  1057. }
  1058. }
  1059. private void frmBalanceMain_FormClosing(object sender, FormClosingEventArgs e)
  1060. {
  1061. var currentquery = laboratoryTests.Where(s => s.OperationType != null && s.OperationType != "").ToList<LaboratoryTest>();
  1062. if (currentquery.Count() > 0)
  1063. {
  1064. DialogResult dr = MessageBox.Show("检测到未保存数据,是否保存?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
  1065. if (dr == DialogResult.Yes)
  1066. {
  1067. e.Cancel = false;
  1068. laboratoryTestBLL.SaveLaboratoryData(currentquery);
  1069. }
  1070. else if (dr == DialogResult.Cancel)
  1071. {
  1072. e.Cancel = true;
  1073. }
  1074. else
  1075. {
  1076. e.Cancel = false;
  1077. }
  1078. }
  1079. }
  1080. private void tsmHelper_Click(object sender, EventArgs e)
  1081. {
  1082. string strHelpFilePath = FileHelper.getBasePath() + @"\BalanceHelper.CHM";
  1083. System.Diagnostics.Process.Start(strHelpFilePath);
  1084. }
  1085. }
  1086. }