using CnasSynchronusClient; using CnasSynchrousModel; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Windows.Forms; using System.Xml.Serialization; namespace CNAS_BalanceClient { public partial class frmBalanceField : Form { SyncInstrumentItemInfo currentSyncItem = new SyncInstrumentItemInfo(); //List lstpramas = new List(); public List syncBalanceItems = new List(); SyncBalanceItem currentBalanceItem = new SyncBalanceItem(); DataBaseInfo targetDataBase = new DataBaseInfo(); public frmBalanceField(List syncBalanceItems, DataBaseInfo targetDataBase) { InitializeComponent(); this.syncBalanceItems = syncBalanceItems; this.targetDataBase = targetDataBase; dgvMapping.AutoGenerateColumns = false; dgvMapping.RowHeadersVisible = false; dgvbalancefield.AutoGenerateColumns = false; dgvbalancefield.RowHeadersVisible = false; dgvCnas.AutoGenerateColumns = false; dgvCnas.RowHeadersVisible = false; } private void lstBalance_SelectedIndexChanged(object sender, EventArgs e) { if (lstBalance.SelectedItem == null) return; string strCurrentSelect = lstBalance.SelectedItem.ToString(); dgvMapping.DataSource = new BindingList(); //根据选中项加载数据 dgvbalancefield.DataSource = new BindingList(BindBalanceField(strCurrentSelect)); //绑定映射数据 var syncItems = syncBalanceItems.Where(s => s.Type == strCurrentSelect).ToList(); if (syncItems != null && syncItems.Count >= 1) { currentBalanceItem = syncItems[0]; if (!string.IsNullOrWhiteSpace(currentBalanceItem.CnasInstrumentColumn)) txtInstrumentColumn.Text = currentBalanceItem.CnasInstrumentColumn; else txtInstrumentColumn.Text = ""; if (syncItems[0].syncParamasInfos!=null) dgvMapping.DataSource = new BindingList(syncItems[0].syncParamasInfos); else dgvMapping.DataSource = new BindingList(); } else { currentBalanceItem = new SyncBalanceItem() { GUID=Guid.NewGuid().ToString(), Type = strCurrentSelect }; syncBalanceItems.Add(currentBalanceItem); } } private List BindBalanceField(string strItem) { List balanceFields = new List(); switch (strItem) { case "全水分": balanceFields=InitinalBalanceField("1"); break; case "水分": balanceFields=InitinalBalanceField("2"); break; case "灰分": balanceFields=InitinalBalanceField("3"); break; case "挥发分": balanceFields=InitinalBalanceField("4"); break; } return balanceFields; } private List InitinalBalanceField(string strValue) { List balanceFields = new List(); //得到类的所有属性 var lstProperties = new LaboratoryTest().GetType().GetProperties(); foreach (var oProperty in lstProperties) { balanceFields.Add(new BalanceField() { FieldName = oProperty.Name, FieldType = oProperty.PropertyType }); ////得到每一个属性的特性类集合 //IList lstAttr = oProperty.GetCustomAttributesData(); //foreach (var oAttr in lstAttr) //{ // var lstAttrArgu = oAttr.NamedArguments; // foreach (CustomAttributeNamedArgument oAttrAru in lstAttrArgu) // { // //if (oAttrAru.MemberInfo.Name == "ApplyType"&& oAttrAru.TypedValue.Value.ToString().Contains(strValue)) // { // balanceFields.Add(new BalanceField() { FieldName = oProperty.Name, FieldType = oProperty.GetType() }); // } // } //} } return balanceFields; } private void frmBalanceField_Load(object sender, EventArgs e) { ////1.加载数据 DataTable dtCNAS = CnasDataOperationFact.CnasDataOperation().GetAllCNASTablesName(targetDataBase); if (dtCNAS != null && dtCNAS.Rows.Count > 0) { List lstCnasTables = new List(); foreach (DataRow dr in dtCNAS.Rows) { lstCnasTables.Add(dr["TABNAME"].ToString()); } cbxCnas.DataSource = lstCnasTables; cbxCnas.ValueMember = ""; } ////2.初始化天平端数据 lstBalance.SelectedIndex = 0; } public class BalanceField { public string FieldName { get; set; } public Type FieldType { get; set; } } private void cbxCnas_SelectedIndexChanged(object sender, EventArgs e) { if (cbxCnas.Text == null) return; string strTableName_Cnas = cbxCnas.Text.ToString(); //从数据库中加载数据表结构 //DataTable dtTableStruct = SQLDB2Helper.getDB2Table(string.Format("SELECT * FROM {0} Where 1=0", strTableName_Cnas)); DataTable dtTableStruct = CnasDataOperationFact.CnasDataOperation().GetCNASTablesStruct(strTableName_Cnas, targetDataBase); if (dtTableStruct != null) { DataTable dtCnasShow = new DataTable(); dtCnasShow.Columns.Add("CnasFieldName"); dtCnasShow.Columns.Add("CnasDataType"); foreach (DataColumn dc in dtTableStruct.Columns) { dtCnasShow.Rows.Add(new object[] { dc.ColumnName, dc.DataType }); } dgvCnas.DataSource = dtCnasShow; //绑定数据 cbxCNASColumn.DataSource = dtCnasShow.Copy(); cbxCNASColumn.DisplayMember = "CnasFieldName"; cbxCNASColumn.ValueMember = "CnasFieldName"; if (dtTableStruct.Columns.Count > 0) { if (!string.IsNullOrWhiteSpace(currentSyncItem.CnasInstrumentColumn) && dtTableStruct.Columns.Contains(currentSyncItem.CnasInstrumentColumn)) { cbxCNASColumn.Text = this.txtInstrumentColumn.Text = currentSyncItem.CnasInstrumentColumn; } else { cbxCNASColumn.Text = this.txtInstrumentColumn.Text = ""; } } } } private void btnAddMapping_Click(object sender, EventArgs e) { if (currentBalanceItem.syncParamasInfos == null) currentBalanceItem.syncParamasInfos = new List(); SyncParamasInfo syncParamas = new SyncParamasInfo(); //仪器表名和选中行 syncParamas.SourceTable = lstBalance.SelectedItem.ToString(); syncParamas.SourceField = dgvbalancefield.Rows[dgvbalancefield.CurrentCell.RowIndex].Cells[0].Value.ToString(); //CNAS表名和选中行 syncParamas.TargetTable = cbxCnas.SelectedValue.ToString().ToUpper(); syncParamas.TargetField = dgvCnas.Rows[dgvCnas.CurrentCell.RowIndex].Cells[0].Value.ToString().ToUpper(); //验证数据合法性 SyncParamsOperation paramsOperation = new SyncParamsOperation(); if (paramsOperation.CheckTableIfRepeat(currentBalanceItem.syncParamasInfos, syncParamas.SourceTable, syncParamas.TargetTable)) { MessageBox.Show("已存在不同表单映射数据,无法添加!", "提示"); return; } //if (paramsOperation.CheckSourceFieldRepeat(currentBalanceItem.syncParamasInfos, syncParamas.SourceTable, syncParamas.SourceField)) //{ // MessageBox.Show("天平端数据字段已分配,请重新选择!"); // return; //} if (paramsOperation.CheckTargetFieldRepeat(currentBalanceItem.syncParamasInfos, syncParamas.TargetTable, syncParamas.TargetField)) { MessageBox.Show("CNAS端数据字段已分配,请重新选择!", "提示"); return; } if (paramsOperation.CheckTargetKeepField(syncParamas.TargetField)) { MessageBox.Show("CNAS端数据字段为保留字段,请重新选择!", "提示"); return; } //绑定数据 currentBalanceItem.syncParamasInfos.Add(syncParamas); dgvMapping.DataSource = new BindingList(currentBalanceItem.syncParamasInfos); //选中最后一行 dgvMapping.CurrentCell = dgvMapping.Rows[dgvMapping.Rows.Count - 1].Cells[0]; } private void btnDeleteMapping_Click(object sender, EventArgs e) { //当前选中项 if (dgvMapping.CurrentCell == null) return; string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString(); string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString(); var lstDelItems = currentBalanceItem.syncParamasInfos.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList(); if (lstDelItems.Count > 0) { foreach (var item in lstDelItems) { currentBalanceItem.syncParamasInfos.Remove(item); } dgvMapping.DataSource = new BindingList(currentBalanceItem.syncParamasInfos); } } private void btnOK_Click(object sender, EventArgs e) { if (!CheckIfHaveDateField()) { if (MessageBox.Show("日期字段的缺失可能会导致后续不能准确数据传输。是否继续保存?", "",MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Cancel) return; } //将数据存储到本地 if (FileOperation.SaveLocalBalanceData(syncBalanceItems)) { this.DialogResult = DialogResult.OK; this.Close(); } else { MessageBox.Show("保存配置失败!", "提示"); } } private void dgvMapping_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (dgvMapping.CurrentCell == null) return; if (dgvMapping.CurrentCell.ColumnIndex == 2) //此时修改的主健列 { string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString(); string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString(); string strPrimaryKey = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["PrimaryKey"].Value.ToString(); var lstDelItems = currentBalanceItem.syncParamasInfos.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList(); if (lstDelItems.Count > 0) { foreach (var item in lstDelItems) { item.IfPrimaryKey = strPrimaryKey.ToLower() == "true" ? true : false; } } } if (dgvMapping.CurrentCell.ColumnIndex == 3) //此时修改的是日期字段列 { string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString(); string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString(); string strDateKey = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["DateKey"].Value.ToString(); var lstDelItems = currentBalanceItem.syncParamasInfos.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList(); if (lstDelItems.Count ==1) { if (strDateKey.ToLower() == "true") { //datagridview显示列 foreach (DataGridViewRow dgvRow in dgvMapping.Rows) { if (dgvRow.Cells["DateKey"].Value.ToString().ToLower() == "true") dgvRow.Cells["DateKey"].Value = false; } //内存数据源 foreach (var item in currentBalanceItem.syncParamasInfos) { if (item.IfDateField) item.IfDateField = false; } lstDelItems[0].IfDateField = true; } else { lstDelItems[0].IfDateField = false; } } } } private void lstBalance_DrawItem(object sender, DrawItemEventArgs e) { Brush myBrush = Brushes.Black; if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) { myBrush = new SolidBrush(Color.FromArgb(0, 0, 255));//选中时背景颜色 } else//没有选中时的背景颜色 { myBrush = new SolidBrush(Color.White); } e.Graphics.FillRectangle(myBrush, e.Bounds);//填满矩形背景颜色 e.Graphics.DrawRectangle(new Pen(new SolidBrush(e.ForeColor)), e.Bounds); e.DrawFocusRectangle();//焦点框 StringFormat stringformat = StringFormat.GenericDefault; stringformat.LineAlignment = StringAlignment.Center; e.Graphics.DrawString(lstBalance.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, stringformat); } private void dgvMapping_CurrentCellDirtyStateChanged(object sender, EventArgs e) { if (dgvMapping.IsCurrentCellDirty) { dgvMapping.CommitEdit(DataGridViewDataErrorContexts.Commit); } } private bool CheckIfHaveDateField() { bool bIfHave = true; foreach (var item in syncBalanceItems) { if (item.syncParamasInfos == null) continue; if (item.syncParamasInfos.Count <=0) continue; if (item.syncParamasInfos.Where(s => s.IfDateField == true).Count() != 1) { bIfHave = false; break; } } return bIfHave; } private void txtInstrumentColumn_DoubleClick(object sender, EventArgs e) { txtInstrumentColumn.Visible = false; cbxCNASColumn.Top = txtInstrumentColumn.Top; cbxCNASColumn.Height = txtInstrumentColumn.Height; cbxCNASColumn.Width = txtInstrumentColumn.Width; cbxCNASColumn.Location = txtInstrumentColumn.Location; cbxCNASColumn.Visible = true; } private void cbxCNASColumn_Leave(object sender, EventArgs e) { if (cbxCNASColumn.Visible) { txtInstrumentColumn.Visible = true; cbxCNASColumn.Visible = false; } } private void cbxCNASColumn_SelectedIndexChanged(object sender, EventArgs e) { if (cbxCNASColumn.Visible) { cbxCNASColumn.Visible = false; txtInstrumentColumn.Visible = true; currentBalanceItem.CnasInstrumentColumn = txtInstrumentColumn.Text = cbxCNASColumn.Text; } } private void btnConditionMap_Click(object sender, EventArgs e) { frmConditionMap frmCNAS = new frmConditionMap(currentBalanceItem, targetDataBase); if (frmCNAS.ShowDialog() == DialogResult.OK) { this.currentBalanceItem = frmCNAS.currentBalanceItem; } } } }