CNAS取数仪器端升级
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

frmBalanceField.cs 15KB

5 lat temu
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. using CnasSynchronusClient;
  2. using CnasSynchrousModel;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Windows.Forms;
  11. using System.Xml.Serialization;
  12. namespace CNAS_BalanceClient
  13. {
  14. public partial class frmBalanceField : Form
  15. {
  16. SyncInstrumentItemInfo currentSyncItem = new SyncInstrumentItemInfo();
  17. //List<SyncParamasInfo> lstpramas = new List<SyncParamasInfo>();
  18. public List<SyncBalanceItem> syncBalanceItems = new List<SyncBalanceItem>();
  19. SyncBalanceItem currentBalanceItem = new SyncBalanceItem();
  20. DataBaseInfo targetDataBase = new DataBaseInfo();
  21. public frmBalanceField(List<SyncBalanceItem> syncBalanceItems, DataBaseInfo targetDataBase)
  22. {
  23. InitializeComponent();
  24. this.syncBalanceItems = syncBalanceItems;
  25. this.targetDataBase = targetDataBase;
  26. dgvMapping.AutoGenerateColumns = false;
  27. dgvMapping.RowHeadersVisible = false;
  28. dgvbalancefield.AutoGenerateColumns = false;
  29. dgvbalancefield.RowHeadersVisible = false;
  30. dgvCnas.AutoGenerateColumns = false;
  31. dgvCnas.RowHeadersVisible = false;
  32. }
  33. private void lstBalance_SelectedIndexChanged(object sender, EventArgs e)
  34. {
  35. if (lstBalance.SelectedItem == null) return;
  36. string strCurrentSelect = lstBalance.SelectedItem.ToString();
  37. dgvMapping.DataSource = new BindingList<SyncParamasInfo>();
  38. //根据选中项加载数据
  39. dgvbalancefield.DataSource = new BindingList<BalanceField>(BindBalanceField(strCurrentSelect));
  40. //绑定映射数据
  41. var syncItems = syncBalanceItems.Where(s => s.Type == strCurrentSelect).ToList<SyncBalanceItem>();
  42. if (syncItems != null && syncItems.Count >= 1)
  43. {
  44. currentBalanceItem = syncItems[0];
  45. if(syncItems[0].syncParamasInfos!=null)
  46. dgvMapping.DataSource = new BindingList<SyncParamasInfo>(syncItems[0].syncParamasInfos);
  47. else
  48. dgvMapping.DataSource = new BindingList<SyncParamasInfo>();
  49. }
  50. else
  51. {
  52. currentBalanceItem = new SyncBalanceItem()
  53. {
  54. Type = strCurrentSelect
  55. };
  56. syncBalanceItems.Add(currentBalanceItem);
  57. }
  58. }
  59. private List<BalanceField> BindBalanceField(string strItem)
  60. {
  61. List<BalanceField> balanceFields = new List<BalanceField>();
  62. switch (strItem)
  63. {
  64. case "全水分":
  65. balanceFields=InitinalBalanceField("1");
  66. break;
  67. case "水分":
  68. balanceFields=InitinalBalanceField("2");
  69. break;
  70. case "灰分":
  71. balanceFields=InitinalBalanceField("3");
  72. break;
  73. case "挥发分":
  74. balanceFields=InitinalBalanceField("4");
  75. break;
  76. }
  77. return balanceFields;
  78. }
  79. private List<BalanceField> InitinalBalanceField(string strValue)
  80. {
  81. List<BalanceField> balanceFields = new List<BalanceField>();
  82. //得到类的所有属性
  83. var lstProperties = new LaboratoryTest().GetType().GetProperties();
  84. foreach (var oProperty in lstProperties)
  85. {
  86. balanceFields.Add(new BalanceField() { FieldName = oProperty.Name, FieldType = oProperty.PropertyType });
  87. ////得到每一个属性的特性类集合
  88. //IList<CustomAttributeData> lstAttr = oProperty.GetCustomAttributesData();
  89. //foreach (var oAttr in lstAttr)
  90. //{
  91. // var lstAttrArgu = oAttr.NamedArguments;
  92. // foreach (CustomAttributeNamedArgument oAttrAru in lstAttrArgu)
  93. // {
  94. // //if (oAttrAru.MemberInfo.Name == "ApplyType"&& oAttrAru.TypedValue.Value.ToString().Contains(strValue))
  95. // {
  96. // balanceFields.Add(new BalanceField() { FieldName = oProperty.Name, FieldType = oProperty.GetType() });
  97. // }
  98. // }
  99. //}
  100. }
  101. return balanceFields;
  102. }
  103. private void frmBalanceField_Load(object sender, EventArgs e)
  104. {
  105. ////1.加载数据
  106. DataTable dtCNAS = CnasDataOperationFact.CnasDataOperation().GetAllCNASTablesName(targetDataBase);
  107. if (dtCNAS != null && dtCNAS.Rows.Count > 0)
  108. {
  109. List<string> lstCnasTables = new List<string>();
  110. foreach (DataRow dr in dtCNAS.Rows)
  111. {
  112. lstCnasTables.Add(dr["TABNAME"].ToString());
  113. }
  114. cbxCnas.DataSource = lstCnasTables;
  115. cbxCnas.ValueMember = "";
  116. }
  117. ////2.初始化天平端数据
  118. lstBalance.SelectedIndex = 0;
  119. }
  120. public class BalanceField
  121. {
  122. public string FieldName { get; set; }
  123. public Type FieldType { get; set; }
  124. }
  125. private void cbxCnas_SelectedIndexChanged(object sender, EventArgs e)
  126. {
  127. if (cbxCnas.Text == null) return;
  128. string strTableName_Cnas = cbxCnas.Text.ToString();
  129. //从数据库中加载数据表结构
  130. //DataTable dtTableStruct = SQLDB2Helper.getDB2Table(string.Format("SELECT * FROM {0} Where 1=0", strTableName_Cnas));
  131. DataTable dtTableStruct = CnasDataOperationFact.CnasDataOperation().GetCNASTablesStruct(strTableName_Cnas, targetDataBase);
  132. if (dtTableStruct != null)
  133. {
  134. DataTable dtCnasShow = new DataTable();
  135. dtCnasShow.Columns.Add("CnasFieldName");
  136. dtCnasShow.Columns.Add("CnasDataType");
  137. foreach (DataColumn dc in dtTableStruct.Columns)
  138. {
  139. dtCnasShow.Rows.Add(new object[] { dc.ColumnName, dc.DataType });
  140. }
  141. dgvCnas.DataSource = dtCnasShow;
  142. }
  143. }
  144. private void btnAddMapping_Click(object sender, EventArgs e)
  145. {
  146. if (currentBalanceItem.syncParamasInfos == null)
  147. currentBalanceItem.syncParamasInfos = new List<SyncParamasInfo>();
  148. SyncParamasInfo syncParamas = new SyncParamasInfo();
  149. //仪器表名和选中行
  150. syncParamas.SourceTable = lstBalance.SelectedItem.ToString();
  151. syncParamas.SourceField = dgvbalancefield.Rows[dgvbalancefield.CurrentCell.RowIndex].Cells[0].Value.ToString();
  152. //CNAS表名和选中行
  153. syncParamas.TargetTable = cbxCnas.SelectedValue.ToString().ToUpper();
  154. syncParamas.TargetField = dgvCnas.Rows[dgvCnas.CurrentCell.RowIndex].Cells[0].Value.ToString().ToUpper();
  155. //验证数据合法性
  156. SyncParamsOperation paramsOperation = new SyncParamsOperation();
  157. if (paramsOperation.CheckTableIfRepeat(currentBalanceItem.syncParamasInfos, syncParamas.SourceTable, syncParamas.TargetTable))
  158. {
  159. MessageBox.Show("已存在不同表单映射数据,无法添加!");
  160. return;
  161. }
  162. //if (paramsOperation.CheckSourceFieldRepeat(currentBalanceItem.syncParamasInfos, syncParamas.SourceTable, syncParamas.SourceField))
  163. //{
  164. // MessageBox.Show("天平端数据字段已分配,请重新选择!");
  165. // return;
  166. //}
  167. if (paramsOperation.CheckTargetFieldRepeat(currentBalanceItem.syncParamasInfos, syncParamas.TargetTable, syncParamas.TargetField))
  168. {
  169. MessageBox.Show("CNAS端数据字段已分配,请重新选择!");
  170. return;
  171. }
  172. if (paramsOperation.CheckTargetKeepField(syncParamas.TargetField))
  173. {
  174. MessageBox.Show("CNAS端数据字段为保留字段,请重新选择!");
  175. return;
  176. }
  177. //绑定数据
  178. currentBalanceItem.syncParamasInfos.Add(syncParamas);
  179. dgvMapping.DataSource = new BindingList<SyncParamasInfo>(currentBalanceItem.syncParamasInfos);
  180. //选中最后一行
  181. dgvMapping.CurrentCell = dgvMapping.Rows[dgvMapping.Rows.Count - 1].Cells[0];
  182. }
  183. private void btnDeleteMapping_Click(object sender, EventArgs e)
  184. {
  185. //当前选中项
  186. if (dgvMapping.CurrentCell == null) return;
  187. string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString();
  188. string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString();
  189. var lstDelItems = currentBalanceItem.syncParamasInfos.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList<SyncParamasInfo>();
  190. if (lstDelItems.Count > 0)
  191. {
  192. foreach (var item in lstDelItems)
  193. {
  194. currentBalanceItem.syncParamasInfos.Remove(item);
  195. }
  196. dgvMapping.DataSource = new BindingList<SyncParamasInfo>(currentBalanceItem.syncParamasInfos);
  197. }
  198. }
  199. private void btnOK_Click(object sender, EventArgs e)
  200. {
  201. if (!CheckIfHaveDateField())
  202. {
  203. if (MessageBox.Show("日期字段的缺失可能会导致后续不能准确数据传输。是否继续保存?", "",MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Cancel)
  204. return;
  205. }
  206. //将数据存储到本地
  207. if (FileOperation.SaveLocalBalanceData(syncBalanceItems))
  208. {
  209. this.DialogResult = DialogResult.OK;
  210. this.Close();
  211. }
  212. else
  213. {
  214. MessageBox.Show("保存配置失败!");
  215. }
  216. }
  217. private void dgvMapping_CellValueChanged(object sender, DataGridViewCellEventArgs e)
  218. {
  219. if (dgvMapping.CurrentCell == null) return;
  220. if (dgvMapping.CurrentCell.ColumnIndex == 2) //此时修改的主健列
  221. {
  222. string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString();
  223. string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString();
  224. string strPrimaryKey = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["PrimaryKey"].Value.ToString();
  225. var lstDelItems = currentBalanceItem.syncParamasInfos.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList<SyncParamasInfo>();
  226. if (lstDelItems.Count > 0)
  227. {
  228. foreach (var item in lstDelItems)
  229. {
  230. item.IfPrimaryKey = strPrimaryKey.ToLower() == "true" ? true : false;
  231. }
  232. }
  233. }
  234. if (dgvMapping.CurrentCell.ColumnIndex == 3) //此时修改的是日期字段列
  235. {
  236. string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString();
  237. string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString();
  238. string strDateKey = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["DateKey"].Value.ToString();
  239. var lstDelItems = currentBalanceItem.syncParamasInfos.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList<SyncParamasInfo>();
  240. if (lstDelItems.Count ==1)
  241. {
  242. if (strDateKey.ToLower() == "true")
  243. {
  244. //datagridview显示列
  245. foreach (DataGridViewRow dgvRow in dgvMapping.Rows)
  246. {
  247. if (dgvRow.Cells["DateKey"].Value.ToString().ToLower() == "true")
  248. dgvRow.Cells["DateKey"].Value = false;
  249. }
  250. //内存数据源
  251. foreach (var item in currentBalanceItem.syncParamasInfos)
  252. {
  253. if (item.IfDateField)
  254. item.IfDateField = false;
  255. }
  256. lstDelItems[0].IfDateField = true;
  257. }
  258. else
  259. {
  260. lstDelItems[0].IfDateField = false;
  261. }
  262. }
  263. }
  264. }
  265. private void lstBalance_DrawItem(object sender, DrawItemEventArgs e)
  266. {
  267. Brush myBrush = Brushes.Black;
  268. if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
  269. {
  270. myBrush = new SolidBrush(Color.FromArgb(0, 0, 255));//选中时背景颜色
  271. }
  272. else//没有选中时的背景颜色
  273. {
  274. myBrush = new SolidBrush(Color.White);
  275. }
  276. e.Graphics.FillRectangle(myBrush, e.Bounds);//填满矩形背景颜色
  277. e.Graphics.DrawRectangle(new Pen(new SolidBrush(e.ForeColor)), e.Bounds);
  278. e.DrawFocusRectangle();//焦点框
  279. StringFormat stringformat = StringFormat.GenericDefault;
  280. stringformat.LineAlignment = StringAlignment.Center;
  281. e.Graphics.DrawString(lstBalance.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, stringformat);
  282. }
  283. private void dgvMapping_CurrentCellDirtyStateChanged(object sender, EventArgs e)
  284. {
  285. if (dgvMapping.IsCurrentCellDirty)
  286. {
  287. dgvMapping.CommitEdit(DataGridViewDataErrorContexts.Commit);
  288. }
  289. }
  290. private bool CheckIfHaveDateField()
  291. {
  292. bool bIfHave = true;
  293. foreach (var item in syncBalanceItems)
  294. {
  295. if (item.syncParamasInfos == null) continue;
  296. if (item.syncParamasInfos.Count <=0) continue;
  297. if (item.syncParamasInfos.Where(s => s.IfDateField == true).Count() != 1)
  298. {
  299. bIfHave = false;
  300. break;
  301. }
  302. }
  303. return bIfHave;
  304. }
  305. }
  306. }