界面图:

残缺代码: [数据库交互和一些工具类等疏忽 只看逻辑]

using System;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Drawing;using System.IO;using System.Reflection;using System.Text;using System.Text.RegularExpressions;using System.Web.Script.Serialization;using System.Windows.Forms;using ess_zbfz_main.commonForm;using ess_zbfz_main.dto;using ess_zbfz_main.entity;using ess_zbfz_main.ifs;using ess_zbfz_main.util;using ess_zbfz_main.vo;using ess_zbfz_main.zhaobiao;using Newtonsoft.Json;using PublicLibrary;namespace ess_zbfz_main.baseInfoFrm{    public partial class FrmBzjAdd : Form,UploadCommonIFS    {        private static string sqliteDbName = ConfigurationManager.AppSettings["sqliteDBName"].ToString();  //数据库名称        private static string sqliteDbLocation = ConfigurationManager.AppSettings["sqliteDBLocation"].ToString(); //数据库寄存门路        //保留接口        internal static string apiSave = "oszbsupplierdeposit/save";        //更新附件信息        internal static string apiUpdateFile = "oszbsupplierdeposit/updateFile";        //以后的我的项目信息        private OsZbPurchaseProjectInfo currentProjectInfo;        //保证金信息        private OsZbSupplierDeposit currentDeposit;        //保证金详情信息        private List<OsZbSupplierDepositDetail> detailList;        //标下拉        private List<ComboBoxVo> markList;        //点击工夫        public DateTime clickTime;        //以后行        private int currentRow =0;        public FrmBzjAdd()        {            InitializeComponent();        }        public FrmBzjAdd(OsZbPurchaseProjectInfo currentProjectInfo, OsZbSupplierDeposit osZbSupplierDeposit)        {            this.currentProjectInfo = currentProjectInfo;            this.currentDeposit = osZbSupplierDeposit;            InitializeComponent();        }        private void FrmBzjAdd_Load(object sender, EventArgs e)        {            this.supplierName.Text = PublicVo.SupplyName;            this.projectName.Text = currentProjectInfo.ProjectName;            this.projectNo.Text = currentProjectInfo.ProjectNo;            this.listDataGriddView.AutoGenerateColumns = false;            //按键            this.totalMoney2.KeyPress += Main_KeyPress;            this.totalInsure.KeyPress += Main_KeyPress;            //失焦事件            this.totalMoney2.LostFocus += Main_LostFocus;            this.totalInsure.LostFocus += Main_LostFocus;            //02物资类到标段填写,01服务类到包填写            if (currentProjectInfo!=null && currentProjectInfo.PurchaseType == "02")            {                this.listDataGriddView.Columns["packName"].Visible = false;            }            LoadData(null);        }        private void Main_LostFocus(object sender, EventArgs e)        {            try            {                TextBox textBox = (TextBox)sender;                string value = textBox.Text;                if (value != null && value.ToString().EndsWith("."))                {                    string valueTxt = value.Substring(0, value.Length-1);                    textBox.Text = valueTxt;                }                if (!string.IsNullOrEmpty(this.totalMoney2.Text) &&                        !string.IsNullOrEmpty(this.totalInsure.Text))                {                    decimal total = Decimal.Add(Convert.ToDecimal(this.totalMoney2.Text), Convert.ToDecimal(this.totalInsure.Text));                    this.total.Text = total.ToString();                }            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }        }        private void Main_KeyPress(object sender, KeyPressEventArgs e)        {            try            {                TextBox textBox = (TextBox)sender;                int start = textBox.SelectionStart;                int len = textBox.SelectionLength;                string text = "";                if (len > 0)                {                    text = textBox.Text.Substring(0, start) + e.KeyChar.ToString() + textBox.Text.Substring(start + len - 1, textBox.Text.Length - start - len);                }                else                {                    text = textBox.Text + e.KeyChar.ToString();                }                string pattern = @"^([1-9]\d{0,12}|0)(\.\d{0,3})?$";                if ("\b".Equals(e.KeyChar.ToString()) || "\r".Equals(e.KeyChar.ToString()) || "\t".Equals(e.KeyChar.ToString()))                {                    return;                }                if (!Regex.IsMatch(text, pattern))                {                    e.Handled = true;                }            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }        }        /// <summary>        /// 加载数据        /// </summary>        /// <param name="flag"></param>        public void LoadData(string flag)        {            try            {                if(this.Owner is FrmBzj)                {                    FrmBzj frmBzj= (FrmBzj)this.Owner;                    //刷新父窗口的办法                    frmBzj.RefreshSelf();                }                 this.listDataGriddView.DataSource = null;                //查问标下拉信息                string markComboboxSql = "select OS_ZB_PURCHASE_PROJECT_INFO.MARK_NO as keyValue,OS_ZB_PURCHASE_PROJECT_INFO.MARK_NAME as keyName  from OS_ZB_PURCHASE_PROJECT_INFO where OS_ZB_PURCHASE_PROJECT_INFO.PROJECT_NO ='" + currentProjectInfo.ProjectNo + "' group by OS_ZB_PURCHASE_PROJECT_INFO.MARK_NO ";                markList = SQLiteLibrary.SelectBySql<ComboBoxVo>(sqliteDbLocation, sqliteDbName, markComboboxSql);                string defaultPattern = "yyyy-MM-dd";                DateUtil.SetDatePick(ref this.yxq, defaultPattern, true, DatePickChange);                //批改页面                if (currentDeposit != null)                {                    string mainSql = "SELECT OS_ZB_SUPPLIER_DEPOSIT.*,OS_ZB_PURCHASE_PROJECT_INFO.PROJECT_NAME,SYS_FILE_INFO.FILE_PATH FROM OS_ZB_SUPPLIER_DEPOSIT";                    mainSql += " left join OS_ZB_PURCHASE_PROJECT_INFO ON OS_ZB_PURCHASE_PROJECT_INFO.PROJECT_NO =OS_ZB_SUPPLIER_DEPOSIT.PROJECT_NO";                    mainSql += "  left join SYS_FILE_INFO on SYS_FILE_INFO.ID =OS_ZB_SUPPLIER_DEPOSIT.ATTACH_ID ";                    mainSql += " where OS_ZB_SUPPLIER_DEPOSIT.id='" + currentDeposit.Id + "'";                    List<OsZbSupplierDeposit> lists = SQLiteLibrary.SelectBySql<OsZbSupplierDeposit>(sqliteDbLocation, sqliteDbName, mainSql);                    currentDeposit = lists.Count > 0 ? lists[0] : null;                                         if ("baodan".Equals(currentDeposit.VoucherCategory))                    {                        currentDeposit.VoucherCategory = "保单";                    }                    else if ("huikuan".Equals(currentDeposit.VoucherCategory))                    {                        currentDeposit.VoucherCategory = "汇款";                    }                    //给主页面局部设置信息                    SetPageMainInfo(this.groupBox1, currentDeposit);                    //投保形式 不能批改                    this.payWay.Enabled = false;                    this.AddRowBtn.Visible = currentDeposit.Sfanjn != "YES";                    //上传的图片                    if (!StringUtil.IsEmpty(currentDeposit.FilePath))                    {                        currentDeposit.FilePath =LocalFileUtil.GetPath(currentDeposit.FilePath);                        Image image = new Bitmap(currentDeposit.FilePath);                        this.pictureBox1.Image =new Bitmap(image, 300, 300);                    }                                        //this.pictureBox1.Image = new                     this.totalMoney2.Text = currentDeposit.TotalMoney;                    string secordSql = "select OS_ZB_SUPPLIER_DEPOSIT_DETAIL.*,OS_ZB_PURCHASE_PROJECT_INFO.MARK_NAME,'No' AS isAddRow from OS_ZB_SUPPLIER_DEPOSIT_DETAIL";                    secordSql += " left join OS_ZB_SUPPLIER_DEPOSIT on OS_ZB_SUPPLIER_DEPOSIT.ID = OS_ZB_SUPPLIER_DEPOSIT_DETAIL.PARENT_ID";                    secordSql += " left join OS_ZB_PURCHASE_PROJECT_INFO on OS_ZB_PURCHASE_PROJECT_INFO.PROJECT_NO = OS_ZB_SUPPLIER_DEPOSIT.PROJECT_NO and OS_ZB_SUPPLIER_DEPOSIT_DETAIL.MARK_NO = OS_ZB_PURCHASE_PROJECT_INFO.MARK_NO";                    secordSql += " where OS_ZB_SUPPLIER_DEPOSIT_DETAIL.PARENT_ID = '" + currentDeposit.Id + "' group by OS_ZB_SUPPLIER_DEPOSIT_DETAIL.ID";                    detailList = SQLiteLibrary.SelectBySql<OsZbSupplierDepositDetail>(sqliteDbLocation, sqliteDbName, secordSql);                    for (int i = 0; i < detailList.Count; i++)                    {                        detailList[i].DepositMoney = string.IsNullOrEmpty(detailList[i].DepositMoney) ? "0" : detailList[i].DepositMoney;                        detailList[i].TotalMoney = string.IsNullOrEmpty(detailList[i].TotalMoney) ? "0" : detailList[i].TotalMoney;                        detailList[i].DepositInsure = string.IsNullOrEmpty(detailList[i].DepositInsure) ? "0" : detailList[i].DepositInsure;                    }                }                else                {                    this.panelActive.Visible = false;                }                //标的下拉选项                DataGridViewColumn dataGridViewColumn = this.listDataGriddView.Columns["markNo"];                if (dataGridViewColumn is DataGridViewComboBoxColumn)                {                    DataGridViewComboBoxColumn comboBoxColum = (DataGridViewComboBoxColumn)dataGridViewColumn;                    ComboBoxVo comboBoxVo = new ComboBoxVo("", "请抉择");                    markList.Insert(0, comboBoxVo);                    comboBoxColum.DataSource = markList;                    comboBoxColum.ValueMember = "keyName";                    comboBoxColum.DisplayMember = "keyValue";                              }                detailList = detailList != null && detailList.Count > 0 ? detailList : new List<OsZbSupplierDepositDetail>();                detailList.Insert(0, new OsZbSupplierDepositDetail());                this.listDataGriddView.DataSource = detailList;                // 移除空白项                this.listDataGriddView.DataSource = null;//必须要                detailList.RemoveAt(0);                this.listDataGriddView.DataSource = detailList;                if (detailList != null && detailList.Count>0)                {                    this.listDataGriddView.Columns["packName"].DataPropertyName = "packName";                }                     }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }        }        /// <summary>        ///  主页面设置值        /// </summary>        /// <param name="mainControl"></param>        /// <param name="currentDeposit"></param>        private void SetPageMainInfo(Control mainControl, OsZbSupplierDeposit currentDeposit)        {            var allControls = mainControl.Controls;            for (int i = 0; i < allControls.Count; i++){                if (allControls[i] is TextBox || allControls[i] is DateTimePicker || allControls[i] is ComboBox)                {                    SetControlValueByEntity(currentDeposit, currentDeposit.GetType(), allControls[i]);                }                if (allControls[i] is CheckBox)                {                    ((CheckBox)allControls[i]).Checked = currentDeposit.Sfanjn == "YES";                }            }        }        /// <summary>        /// 给控件设置值        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="t"></param>        /// <param name="type"></param>        /// <param name="control"></param>        private void SetControlValueByEntity<T>(T t, Type type, Control control)        {            string propName = StringUtil.UpperCaseFirst(control.Name);            BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;            PropertyInfo propertyInfo = type.GetProperty(propName, bindingFlags);            if (propertyInfo != null)            {                object value =propertyInfo.GetValue(t);                control.Text = value!=null?value.ToString():null;            }           /* else if (propertyInfo == null && "DepositInsure".Equals(propName))//保险可为0            {                propertyInfo.SetValue(t, "0");            }*/        }        /// <summary>        ///  全选和全不选        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnAllCheck_Click(object sender, EventArgs e)        {            string tag = this.btnAllCheck.Tag.ToString();            //完结编辑            this.listDataGriddView.EndEdit();            bool check = false;            //全选            if (tag == "checkAll")            {                check = true;            }            int count = Convert.ToInt16(listDataGriddView.Rows.Count.ToString());            for (int i = 0; i < count; i++)            {                DataGridViewCheckBoxCell selectCheckCell = (DataGridViewCheckBoxCell)listDataGriddView.Rows[i].Cells["select_check"];                //bool flag = Convert.ToBoolean(selectCheckCell.Value);                selectCheckCell.Value = check;            }            //            if (tag == "checkAll")            {                this.btnAllCheck.Text = "全不选";                this.btnAllCheck.Tag = "unAllcheck";                this.btnAllCheck.Image = Properties.Resources.all_uncheck_20;                this.btnAllCheck.Width += 6;            }            else            {                this.btnAllCheck.Text = "全选";                this.btnAllCheck.Tag = "checkAll";                this.btnAllCheck.Image = Properties.Resources.all_check_20;                this.btnAllCheck.Width -= 6;            }        }        /// <summary>        ///  删除性能 --- UI删除行 不操作数据库        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnDelete_Click(object sender, EventArgs e)        {            try            {                int count = Convert.ToInt16(listDataGriddView.Rows.Count.ToString());                //物理新增的行                List<int> deleteRows = new List<int>();                             //绑定数据源的行                List<OsZbSupplierDepositDetail> dataSourceRows = new List<OsZbSupplierDepositDetail>();                for (int i = 0; i < count; i++)                {                    if ((bool)listDataGriddView.Rows[i].Cells[0].EditedFormattedValue == true)                    {                        if (detailList!=null && detailList.Count> i)                        {                            dataSourceRows.Add(detailList[i]);                        }                        else                        {                            deleteRows.Add(i);                        }                    }                }                if (deleteRows.Count <= 0 && dataSourceRows.Count<=0)                {                    MessageBox.Show("请抉择须要删除的数据", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);                }                for (int i = 0; i < deleteRows.Count; i++)                {                    //this.listDataGriddView.Rows.                    this.listDataGriddView.Rows.RemoveAt(deleteRows[i]);                }                for (int i = 0; i < dataSourceRows.Count; i++)                {                    detailList.Remove(dataSourceRows[i]);                }                if (dataSourceRows.Count > 0)                {                                       this.listDataGriddView.DataSource = null;//必须要                    this.listDataGriddView.DataSource = detailList;                }                //计算                CalMoney(-1);            }            catch (Exception ex)            {                MessageBox.Show("刪除异样,错误信息:" + ex.Message, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }        }        //刷新        private void btnRefesh_Click(object sender, EventArgs e)        {            LoadData(null);        }        /// <summary>        ///  新增行事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void AddRowBtn_Click(object sender, EventArgs e)        {            object dataSource = this.listDataGriddView.DataSource;            this.listDataGriddView.Enabled = false;            //this.listDataGriddView.AllowUserToAddRows = true;            //如果绑定了数据源 须要先勾销绑定            if (dataSource is List<OsZbSupplierDepositDetail>)            {                List<OsZbSupplierDepositDetail> detailList =(List<OsZbSupplierDepositDetail>)this.listDataGriddView.DataSource;                OsZbSupplierDepositDetail detail = new OsZbSupplierDepositDetail();                detailList.Add(detail);                this.listDataGriddView.DataSource = null;                this.listDataGriddView.DataSource = detailList;                   }            else            {                this.listDataGriddView.Rows.Add();//新增行            }            this.listDataGriddView.Enabled = true;        }        /// <summary>        ///  计算金额局部        /// </summary>        private void CalMoney(int curRow)        {            try            {                int rowCount = this.listDataGriddView.Rows.Count;                //行--保证金总额                Decimal rowTotal = new Decimal();                //顶部统计 保证金总额  保险总额 总金额                Decimal totalBzj = new Decimal();                Decimal totalBx = new Decimal();                Decimal total = new Decimal();                for (int i = 0; i < rowCount; i++)                {                    rowTotal = AddCalByRows(this.listDataGriddView.Rows[i].Cells["depositMoney"], this.listDataGriddView.Rows[i].Cells["depositInsure"]);                    totalBzj = Decimal.Add(totalBzj, GetFormateValue(this.listDataGriddView.Rows[i].Cells["depositMoney"]));                    totalBx = Decimal.Add(totalBx, GetFormateValue(this.listDataGriddView.Rows[i].Cells["depositInsure"]));                    total = Decimal.Add(total, rowTotal);                    //扭转事件的触发行 【不须要设置curRow写-1】                    if (curRow == i)                    {                        this.listDataGriddView.Rows[i].Cells["totalMoney"].Value = rowTotal;                    }                }                this.totalMoney2.Text = totalBzj.ToString();                this.totalInsure.Text = totalBx.ToString();                this.total.Text = total.ToString();            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);                //throw;            }        }        /// <summary>        ///  计算两个单元格值的和        /// </summary>        /// <param name="cell1"></param>        /// <param name="cell2"></param>        /// <returns></returns>        private decimal AddCalByRows(DataGridViewCell cell1, DataGridViewCell cell2)        {            return Decimal.Add(GetFormateValue(cell1), GetFormateValue(cell2));        }        /// <summary>        ///  设置单元格的值        /// </summary>        /// <param name="cell"></param>        /// <returns></returns>        private decimal GetFormateValue(DataGridViewCell cell)        {            Decimal val1 = Decimal.Zero;            if (cell.Value != null)            {                val1 = Convert.ToDecimal(cell.Value.ToString());            }            return val1;        }        //单元格批改结束        private void listDataGriddView_CellEndEdit(object sender, DataGridViewCellEventArgs e)        {            try            {                if (e.RowIndex < 0 || e.ColumnIndex<0)                {                    return;                }                //计算                CalMoney(e.RowIndex);                if (this.listDataGriddView.Columns[e.ColumnIndex].Name == "markNo")                {                                                DataGridViewCell dataGridViewCell = this.listDataGriddView.CurrentRow.Cells["markNo"];                    object o = dataGridViewCell.Value;                    int markNoIndex =this.listDataGriddView.Columns["markName"].Index;                    this.listDataGriddView.CurrentRow.Cells["markName"].Value = o;                    this.listDataGriddView.UpdateCellValue(markNoIndex, e.RowIndex);// 强制更新这个单元格的数据                    string markNo = "";                    if (dataGridViewCell is DataGridViewComboBoxCell)                    {                        DataGridViewComboBoxCell.ObjectCollection objectCollection = ((DataGridViewComboBoxCell)dataGridViewCell).Items;                        for (int i = 0; i < objectCollection.Count; i++)                        {                            if (objectCollection[i] is ComboBoxVo && ((ComboBoxVo)objectCollection[i]).KeyName== o)                            {                                markNo = ((ComboBoxVo)objectCollection[i]).KeyValue;                                this.listDataGriddView.CurrentRow.Cells["markNo_R"].Value = markNo;                            }                        }                                           }                    if (o != null && o.ToString() != null && !"请抉择".Equals(o.ToString()))                    {                        //分标名称                        //查问标下拉信息                        //+ " and OS_ZB_PURCHASE_PROJECT_INFO.SIGN_UP='YES'                        string packComboboxSql = "select OS_ZB_PURCHASE_PROJECT_INFO.PACK_NO as keyName,OS_ZB_PURCHASE_PROJECT_INFO.PACK_NAME as keyValue  from OS_ZB_PURCHASE_PROJECT_INFO where OS_ZB_PURCHASE_PROJECT_INFO.MARK_NO ='" + markNo + "' order by PACK_NAME";                        List<ComboBoxVo> packList = SQLiteLibrary.SelectBySql<ComboBoxVo>(sqliteDbLocation, sqliteDbName, packComboboxSql);                        DataGridViewColumn column = this.listDataGriddView.Columns["packName"];                        if (column is DataGridViewComboBoxColumn)                        {                            DataGridViewComboBoxCell boxCell = new DataGridViewComboBoxCell();                            DataGridViewComboBoxColumn comboBoxColum = (DataGridViewComboBoxColumn)column;                            List<string> pklist = new List<string>();                            for (int i = 0; i < packList.Count; i++)                            {                                pklist.Add(packList[i].KeyValue);                            }                            if(pklist!=null && pklist.Count > 0)                            {                                pklist.Insert(0, "请抉择");                            }                            else                            {                                pklist.Insert(0, "暂无数据");                            }                                                       boxCell.DataSource = pklist;                            //boxCell.Value = e.RowIndex< detailList.Count?detailList[e.RowIndex].PackName:"";                            //分包信息                            this.listDataGriddView.CurrentRow.Cells[3] = boxCell;                        }                    }                }            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }        }        /// <summary>        /// 保留提交操作        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnSave_Click(object sender, EventArgs e)        {            R result = null;            //完结编辑            this.listDataGriddView.EndEdit();            this.btnSave.Focus();            //this.totalMoney2.LostFocus;            try            {                //主键id                string primaryKey = System.Guid.NewGuid().ToString("N");                //批改                if (currentDeposit != null && currentDeposit.Id!=null)                {                    primaryKey = currentDeposit.Id;                }                var controls = this.groupBox1.Controls;                OsZbSupplierDeposit osZbSupplierDeposit = new OsZbSupplierDeposit();                for (int i = 0; i < controls.Count; i++)                {                    if (controls[i] is TextBox || controls[i] is ComboBox || controls[i] is DateTimePicker)                    {                        SetValueByControl(osZbSupplierDeposit, osZbSupplierDeposit.GetType(), controls[i]);                    }                }                osZbSupplierDeposit.SupplierId = PublicVo.SupplyId;                osZbSupplierDeposit.Id = primaryKey;                osZbSupplierDeposit.TotalMoney = this.totalMoney2.Text;                osZbSupplierDeposit.Sfanjn = this.sfanjn.Checked ? "YES" : "NO";                if (currentDeposit != null && currentDeposit.Id != null)                {                    osZbSupplierDeposit.AttachId = currentDeposit.AttachId;                }                List<OsZbSupplierDepositDetail> detailList = GetDataGridInfo(primaryKey,true);                if(osZbSupplierDeposit.Remark != null && osZbSupplierDeposit.Remark.Length > 500)                {                    MessageBox.Show("备注内容长度最大为500个字符", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);                    return;                }                if (osZbSupplierDeposit.Sfanjn!="YES" && detailList.Count <= 0)                {                    MessageBox.Show("至多须要填写一条详情数据", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);                    return;                }                //验证                MessageInfo<OsZbSupplierDepositDetail> messageInfo = VerifyUtil.Verify(detailList, "baozhengjin", true, "");                if (osZbSupplierDeposit.Sfanjn == "YES")                {                    MessageInfo<OsZbSupplierDeposit> verifyMain = VerifyUtil.Verify(osZbSupplierDeposit, "baozhengjin");                    if (verifyMain.ExistError)                    {                        messageInfo.ExistError = true;                        messageInfo.ErrorInfo = verifyMain.ErrorInfo+"\n"+messageInfo.ErrorInfo;                    }                }                Dictionary<string, string> checkRepeat = new Dictionary<string, string>();                StringBuilder sbfInfo = new StringBuilder();                string checkField1 = "";                string checkField2= "";                string checkMsg= currentProjectInfo.PurchaseType == "02"?"标":"包";                for (var i = 0; i < detailList.Count; i++)                {                    //01 服务 02物资 物资类到标段填写,服务类到包填写                    checkField1 = currentProjectInfo.PurchaseType == "02" ? detailList[i].MarkNo : (detailList[i].PackName=="请抉择"?"":detailList[i].PackName);                    checkField2 = currentProjectInfo.PurchaseType == "02" ? detailList[i].MarkNo : detailList[i].MarkNo + "-" + (detailList[i].PackName == "请抉择" ? "" : detailList[i].PackName);                    if (string.IsNullOrEmpty(checkField1))                    {                        sbfInfo.Append($"第{i + 1}行 该{checkMsg}信息的未填写\n");                        messageInfo.ExistError = true;                    }                    if (checkRepeat.ContainsKey(checkField2))                    {                        sbfInfo.Append($"第{i + 1}行 该{checkMsg}信息的反复填写\n");                        messageInfo.ExistError = true;                    }                    else                    {                        checkRepeat.Add(checkField2, "");                    }                }                messageInfo.ErrorInfo += sbfInfo.ToString();                if (messageInfo.ExistError && !StringUtil.IsBlack(messageInfo.ErrorInfo))                {                    MessageBox.Show(messageInfo.ErrorInfo, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);                    return;                }                osZbSupplierDeposit.ListData = detailList;                result = WebRequestUtil.PostBasicEntityDataApi(apiSave, osZbSupplierDeposit);                if (!result.Successful)                {                    MessageBox.Show(result.ResultHint, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);                    return;                }                string mainSql = "";                //批改                if (currentDeposit != null && currentDeposit.Id != null)                {                    mainSql = SQLiteSqlUtils.CreateUpdateSql(osZbSupplierDeposit, new string[] { "id" });                                        //删除副表信息                    string deleteDetailSql = "delete  from OS_ZB_SUPPLIER_DEPOSIT_DETAIL where OS_ZB_SUPPLIER_DEPOSIT_DETAIL.PARENT_ID='"+ primaryKey + "'";                    SQLiteLibrary.ExecuteSqlByTransaction(sqliteDbLocation, sqliteDbName, new string[] { mainSql, deleteDetailSql });                    if (detailList != null && detailList.Count > 0)                    {                        string insertDetailSql = SQLiteSqlUtils.CreateInsertSql(detailList);                        SQLiteLibrary.insertData(sqliteDbLocation, sqliteDbName, insertDetailSql);                    }                }                else                {                    //新增                    mainSql = SQLiteSqlUtils.CreateInsertSql(osZbSupplierDeposit);                    SQLiteLibrary.insertData(sqliteDbLocation, sqliteDbName, mainSql);                    if (detailList!=null && detailList.Count > 0)                    {                        string insertDetailSql = SQLiteSqlUtils.CreateInsertSql(detailList);                        SQLiteLibrary.insertData(sqliteDbLocation, sqliteDbName,insertDetailSql);                    }                }                MessageBox.Show("保留胜利", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Information);                LoadData(null);                this.Hide();                this.Close();            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }        }        /// <summary>        ///  获取datagridView的值        /// </summary>        /// <returns></returns>        private List<OsZbSupplierDepositDetail> GetDataGridInfo(string relPrimaryKey,bool idAuto)        {            List<OsZbSupplierDepositDetail> detailList = new List<OsZbSupplierDepositDetail>();            try            {                DataGridView dataGridView = this.listDataGriddView;                BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static                            | BindingFlags.Public | BindingFlags.NonPublic;                PropertyInfo propertyInfo = null;                int rowCount = dataGridView.Rows.Count;                int columCount = dataGridView.Columns.Count;                OsZbSupplierDepositDetail depositDetail = null;                //行                for (int i = 0; i < rowCount; i++)                {                    depositDetail = new OsZbSupplierDepositDetail();                    //列                    for (int k = 0; k < columCount; k++)                    {                        SetObjValue(depositDetail, depositDetail.GetType(),                            dataGridView.Columns[k].Name, dataGridView.Rows[i].Cells[k]);                    }                    //设置主键的值                    if (!StringUtil.IsEmpty(relPrimaryKey))                    {                        propertyInfo = depositDetail.GetType().GetProperty("ParentId", bindingFlags);                        if (propertyInfo != null)                        {                            propertyInfo.SetValue(depositDetail, relPrimaryKey);                        }                    }                    //注解主动设置                    if (idAuto)                    {                        propertyInfo = depositDetail.GetType().GetProperty("Id", bindingFlags);                        if (propertyInfo != null)                        {                            propertyInfo.SetValue(depositDetail, System.Guid.NewGuid().ToString("N"));                        }                    }                    depositDetail.MarkNo = depositDetail.MarkNo_R;                    detailList.Add(depositDetail);                }            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }            return detailList;        }        /// <summary>        ///  datagridView 取值 封装成数组对象=== 一行一行的设置        /// </summary>        /// <param name="depositDetail"></param>        /// <param name="type"></param>        /// <param name="name"></param>        /// <param name="dataGridViewCell"></param>        private void SetObjValue<T>(T t, Type type, string name, DataGridViewCell dataGridViewCell)        {            string propName = StringUtil.UpperCaseFirst(name);            if (dataGridViewCell.Value != null)            {                string textValue = dataGridViewCell.Value.ToString();                BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;                PropertyInfo propertyInfo = type.GetProperty(propName, bindingFlags);                if (propertyInfo != null)                {                    if ("DepositInsure".Equals(propName) && string.IsNullOrEmpty(textValue))//保险可为0                    {                        propertyInfo.SetValue(t, "0");                    }                    else                    {                        propertyInfo.SetValue(t, textValue);                    }                  }            }            else            {                if ("DepositInsure".Equals(propName))//保险可为0                {                    PropertyInfo propertyInfo = type.GetProperty(propName);                    propertyInfo.SetValue(t, "0");                }            }        }        /// <summary>        /// 给对象设置值        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="t"></param>        /// <param name="type"></param>        /// <param name="control"></param>        private void SetValueByControl<T>(T t, Type type, Control control)        {            string propName = StringUtil.UpperCaseFirst(control.Name);            string textValue = control.Text;            BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;            PropertyInfo propertyInfo = type.GetProperty(propName, bindingFlags);            if (propertyInfo != null)            {                propertyInfo.SetValue(t, textValue);            }            else if (propertyInfo == null && "DepositInsure".Equals(propName))//保险可为0            {                propertyInfo.SetValue(t, "0");            }        }        /// <summary>        ///  从新定义编辑框        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void listDataGriddView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)        {            e.Control.Controls.Clear();            int colum = this.listDataGriddView.CurrentCell.ColumnIndex;            string columName = this.listDataGriddView.Columns[colum].Name;            if(e.Control is DataGridViewTextBoxEditingControl)            {                if (columName == "payTime")                {                    DateTimePicker btn = new DateTimePicker();                    e.Control.Controls.Add(btn);                    btn.Dock = DockStyle.Fill;                    btn.Cursor = Cursors.Default;                    btn.Format = DateTimePickerFormat.Custom;                    btn.CustomFormat = "yyyy-MM-dd";                    TableVo tableVo = new TableVo(this.listDataGriddView.CurrentCell.RowIndex, colum);                    btn.Tag = tableVo;//记录编辑的行和列                    btn.ValueChanged += SetCellValue;                    var cellValue = this.listDataGriddView.CurrentCell.Value;                    //btn.MaxDate = DateTime.Now;                    string pattern = @"\d{4}[/-]\d{1,2}[/-]\d{1,2}";                    Regex regex = new Regex(pattern);                    var defaultValue = DateTime.Now.ToString();                    defaultValue = regex.IsMatch(defaultValue) ? regex.Match(defaultValue).Groups[0].ToString() : defaultValue;                    this.listDataGriddView.CurrentCell.Value = cellValue != null ? cellValue : defaultValue;                    btn.Value = Convert.ToDateTime(this.listDataGriddView.CurrentCell.Value.ToString());                    //this.listDataGriddView.Rows[].Cells[this.listDataGriddView.CurrentColumn].Value = curValue;                }                else if ("depositMoney".Equals(columName) || "depositInsure".Equals(columName) || "totalMoney".Equals(columName))                {                    DataGridViewTextBoxEditingControl dgvTxt = (DataGridViewTextBoxEditingControl)e.Control; // 赋值                                                                                                               //dgvTxt.Name = columName;                    dgvTxt.KeyPress -= Cells_KeyPress; // 移除事件                                                                                             //dgvTxt.SelectAll();                    dgvTxt.KeyPress += Cells_KeyPress; // 绑定到事件                       //先让编辑框聚焦                    dgvTxt.Focus();                    //设置光标的地位到文本尾                    dgvTxt.Select(dgvTxt.TextLength, 0);                    //滚动到控件光标处                    dgvTxt.ScrollToCaret();                }                else                {                    DataGridViewTextBoxEditingControl dgvTxt = (DataGridViewTextBoxEditingControl)e.Control; // 赋值                      dgvTxt.KeyPress -= Cells_KeyPress; // 移除事件                   }            }        }        /// <summary>        ///  自定义的日历 扭转值事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void SetCellValue(object sender, EventArgs e)        {            DateTimePicker btn = (DateTimePicker)sender;            if(btn.Tag is TableVo)            {                TableVo tableVo = (TableVo)btn.Tag;                object value = btn.Value;                string curValue = "";                Console.WriteLine("以后值:"+ value);                if (value != null)                {                    string pattern = @"\d{4}[/-]\d{1,2}[/-]\d{1,2}";                    Regex regex = new Regex(pattern);                    curValue = btn.Value.ToString();                    curValue = regex.IsMatch(curValue) ? regex.Match(curValue).Groups[0].ToString() : curValue;                                   }                this.listDataGriddView.Rows[tableVo.CurrentRow].Cells[tableVo.CurrentColumn].Value = curValue;            }                }        private void Cells_KeyPress(object sender, KeyPressEventArgs e)        {                DataGridViewTextBoxEditingControl dgvTxt = (DataGridViewTextBoxEditingControl)sender;                int start = dgvTxt.SelectionStart;                int len = dgvTxt.SelectionLength;                string text = "";                if (len > 0)                {                    text = dgvTxt.Text.Substring(0, start) + e.KeyChar.ToString() + dgvTxt.Text.Substring(start + len - 1, dgvTxt.Text.Length - start - len);                }                else                {                    text = dgvTxt.Text + e.KeyChar.ToString();                }                string pattern = @"^([1-9]\d{0,12}|0)(\.\d{0,3})?$";                if ("\b".Equals(e.KeyChar.ToString()) || "\r".Equals(e.KeyChar.ToString()) || "\t".Equals(e.KeyChar.ToString()))                {                    return;                }                if (!Regex.IsMatch(text, pattern))                {                    e.Handled = true;                }                    }        /// <summary>        ///  行减少事件===>多级联动 [须要把dataPropetyName值移除]        /// </summary>        /// <param name="sender"></param>        /// <param name="ev"></param>        private void listDataGriddView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs ev)        {            if (ev.RowIndex == -1 || ev.RowCount == 0 || detailList== null)            {                return;            }            //Console.WriteLine("行数:------------" + ev.RowCount);            int maxCount = detailList != null && detailList.Count > ev.RowCount ? detailList.Count : ev.RowCount;            maxCount = ev.RowCount <= 1 ? ev.RowCount : maxCount;            for (int i = 0; i < maxCount; i++)            {                string packComboboxSql = "select OS_ZB_PURCHASE_PROJECT_INFO.PACK_NO as keyName,OS_ZB_PURCHASE_PROJECT_INFO.PACK_NAME as keyValue  from OS_ZB_PURCHASE_PROJECT_INFO where OS_ZB_PURCHASE_PROJECT_INFO.MARK_NO ='" + detailList[i].MarkNo + "' order by PACK_NAME";                List<ComboBoxVo> packList = SQLiteLibrary.SelectBySql<ComboBoxVo>(sqliteDbLocation, sqliteDbName, packComboboxSql);                DataGridViewColumn column = this.listDataGriddView.Columns["packName"];                if (column is DataGridViewComboBoxColumn)                {                    List<string> pklist = new List<string>();                    for (int k = 0; k < packList.Count; k++)                    {                        pklist.Add(packList[k].KeyValue);                    }                    pklist.Insert(0, "请抉择");                    DataGridViewComboBoxCell boxCell = new DataGridViewComboBoxCell();                    boxCell.Value = detailList.Count <= currentRow ? "" : detailList[currentRow].PackName;                    Console.WriteLine("值:" + boxCell.Value);                    boxCell.DataSource = pklist;                    //分包信息                                      this.listDataGriddView.Rows[i].Cells["packName"] = boxCell;                }            }            /* DataGridView dgv = (DataGridView)sender;                 Console.WriteLine("次数:------------"+ currentRow);             currentRow++;             //以后行 不能超过数据的最大行             if (ev.RowIndex < dgv.Rows.Count)             {                 //&& detailList == null                 if (dgv.Columns[1].Name == "markNo")                 {                     string packComboboxSql = "select OS_ZB_PURCHASE_PROJECT_INFO.PACK_NO as keyName,OS_ZB_PURCHASE_PROJECT_INFO.PACK_NAME as keyValue  from OS_ZB_PURCHASE_PROJECT_INFO where OS_ZB_PURCHASE_PROJECT_INFO.MARK_NO ='" + detailList[ev.RowIndex].MarkNo + "'";                     List<ComboBoxVo> packList = SQLiteLibrary.SelectBySql<ComboBoxVo>(sqliteDbLocation, sqliteDbName, packComboboxSql);                     DataGridViewColumn column = this.listDataGriddView.Columns[2];                     if (column is DataGridViewComboBoxColumn)                     {                         List<string> pklist = new List<string>();                         for (int i = 0; i < packList.Count; i++)                         {                             pklist.Add(packList[i].KeyValue);                         }                         pklist.Insert(0, "请抉择");                         DataGridViewComboBoxCell boxCell = new DataGridViewComboBoxCell();                         boxCell.Value = detailList.Count <= currentRow ? "" : detailList[currentRow].PackName;                         Console.WriteLine("值:" + boxCell.Value);                         boxCell.DataSource = pklist;                         //分包信息                         boxCell.Value = detailList[ev.RowIndex].PackName;                         this.listDataGriddView.Rows[ev.RowIndex].Cells[2] = boxCell;                         //detailList[ev.RowIndex].PackName;                         //currentRow++;                     }                 }             }*/        }        /// <summary>        ///  单元格验证        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void listDataGriddView_CellValidated(object sender, DataGridViewCellEventArgs e)        {            DataGridViewColumn currentColum = this.listDataGriddView.Columns[e.ColumnIndex];            string columName= currentColum.Name;            if("depositMoney".Equals(columName) || "depositInsure".Equals(columName) || "totalMoney".Equals(columName) )            {                var value = this.listDataGriddView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;                if(value!=null && value.ToString().EndsWith("."))                {                    this.listDataGriddView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = value.ToString().Substring(0, value.ToString().Length - 1);                }            }        }        /// <summary>        /// 图片上传        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void button1_Click(object sender, EventArgs e)        {            UploadForm upload = new UploadForm(GetSelectType(), "文件|*.jpg;*.png;*bpm,*pdf;*PDF");            DialogUtil.ShowDialog(upload, this, 800, 500, new FormWindowProp(false, false, FormBorderStyle.FixedSingle));        }        /// <summary>        ///  下拉框信息[原经营异样名录==》变为企业信用查问报告 重大守法企业名单==》该类型删除]        /// </summary>        /// <returns></returns>        private List<ComboBoxVo> GetSelectType()        {            List<ComboBoxVo> list = new List<ComboBoxVo>();            ComboBoxVo v0 = new ComboBoxVo("请抉择", "");            ComboBoxVo v1 = new ComboBoxVo("保单", "baodan", "文件|" + ConstantVo.FILE_TYPE_IMAGE_2);            ComboBoxVo v3 = new ComboBoxVo("汇款", "huikuan", "文件|" + ConstantVo.FILE_TYPE_IMAGE_2);            list.Add(v0);            list.Add(v1);            list.Add(v3);            return list;        }        /// <summary>        ///         /// </summary>        /// <param name="fileInfoList"></param>        /// <param name="childCallBack">子页面回调办法</param>        /// <returns></returns>        public R CallBackUpload(List<FileInfoVo> fileInfoList, Action childCallBack)        {            R resultR = new R();            try            {                //上传完了写入数据库                FileInfoVo fileInfoVo = fileInfoList[0];                currentDeposit.AttachId = fileInfoVo.EnclosureId;//附件id                currentDeposit.VoucherCategory = fileInfoVo.AttachType;                SysFileInfo sysFile = new SysFileInfo();                util.ObjectUtil.CopyPop(fileInfoVo, ref sysFile);                sysFile.Id = fileInfoVo.EnclosureId;                //单纯的数据存储                resultR = WebRequestUtil.PostBasicEntityDataApi(apiUpdateFile, currentDeposit);                if (!resultR.Successful)                {                    MessageBox.Show(resultR.ResultHint, "提醒", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);                    return resultR;                }                //附件信息                SQLiteLibrary.insertData(sqliteDbLocation, sqliteDbName, SQLiteSqlUtils.CreateInsertSql(sysFile));                SQLiteLibrary.ExcuteSql(SQLiteSqlUtils.CreateUpdateSql(currentDeposit,new string[] {"id"}));                resultR.Successful = true;                //从新加载数据                LoadData(null);            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);                return resultR;            }            finally { }            return resultR;        }               /// <summary>        /// 缴纳形式 选中扭转触发事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)        {            ComboBox comboBox =(ComboBox)sender;            this.sfanjn.Enabled = comboBox.SelectedItem.ToString() == "投保";            if(this.listDataGriddView.DataSource is List<OsZbSupplierDepositDetail>)            {                this.listDataGriddView.DataSource = detailList;                     }            else            {                this.listDataGriddView.Rows.Clear();                this.listDataGriddView.DataSource = detailList;            }            //comboBox.SelectedItem.ToString() == "电汇"            if (!this.sfanjn.Enabled)            {                this.sfanjn.Checked = false;                this.yxq.Enabled = false;                this.totalInsure.Text = "";                this.totalInsure.ReadOnly = true;                this.totalMoney2.Text = "";                this.totalMoney2.ReadOnly = true;                this.bdh.Text = "";                this.bdh.ReadOnly = true;                this.listDataGriddView.Columns["depositInsure"].Visible = true;                this.listDataGriddView.Columns["totalMoney"].Visible = true;                this.listDataGriddView.Columns["depositMoney"].HeaderText = "总额-汇款(元)";            }            if(comboBox.SelectedItem.ToString() == "电汇")            {                this.listDataGriddView.Columns["depositMoney"].HeaderText = "总额(元)";                this.listDataGriddView.Columns["depositInsure"].Visible = false;                this.listDataGriddView.Columns["totalMoney"].Visible = false;            }        }        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)        {        }        private void groupBox1_Enter(object sender, EventArgs e)        {        }        /// <summary>        /// 是否按年缴纳        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void sfanjn_CheckedChanged(object sender, EventArgs e)        {            CheckBox checkBox = (CheckBox)sender;           if(checkBox.Checked && this.payWay.Text == "投保")            {                this.yxq.Enabled = true;                this.totalInsure.ReadOnly = false;                this.totalMoney2.ReadOnly = false;                this.bdh.ReadOnly = false;                this.AddRowBtn.Visible = false;                this.btnAllCheck.Visible = false;                this.btnDelete.Visible = false;                if (this.listDataGriddView.DataSource is List<OsZbSupplierDepositDetail>)                {                    this.listDataGriddView.DataSource = null;                }                else                {                    this.listDataGriddView.Rows.Clear();                    this.listDataGriddView.DataSource = null;                }                /*this.listDataGriddView.Rows.Clear();                this.listDataGriddView.DataSource = null;*/            }            else            {                this.yxq.Enabled = false;                this.totalInsure.Text = "";                this.totalInsure.ReadOnly = true;                this.totalMoney2.Text = "";                this.totalMoney2.ReadOnly = true;                this.bdh.Text = "";                this.bdh.ReadOnly = true;                this.AddRowBtn.Visible = true;                this.btnAllCheck.Visible = true;                this.btnDelete.Visible = true;            }        }        private void DatePickChange(object sender, EventArgs e)        {            DateTimePicker timePicker = (DateTimePicker)sender;            timePicker.CustomFormat = "yyyy-MM-dd";        }        private void totalMoney2_TextChanged(object sender, EventArgs e)        {        }        private void listDataGriddView_CellClick(object sender, DataGridViewCellEventArgs e)        {            if(e.RowIndex <0 && e.ColumnIndex < 0)            {                return;            }        }        /* /// <summary>         /// 移除控件 某个注册事件         /// </summary>         public void RemoveEvent(object eventObj)         {             KeyPressEventHandler keyPressEventHand = null;             EventHandler eventHand = null;             Delegate[] dels = null;             if (eventObj is KeyPressEventHandler)             {                 keyPressEventHand = (KeyPressEventHandler)eventObj;                 dels = keyPressEventHand.GetInvocationList();             }             else if (eventObj is EventHandler)             {                 eventHand = (EventHandler)eventObj;                 dels = eventHand.GetInvocationList();             }             foreach (Delegate d in dels)             {                 //失去办法名                 object delObj = d.GetType().GetProperty("Method").GetValue(d, null);                 string funcName = (string)delObj.GetType().GetProperty("Name").GetValue(delObj, null);                 if (keyPressEventHand != null)                 {                     keyPressEventHand -= d as KeyPressEventHandler;                 }                 if (eventHand != null)                 {                     eventHand -= d as EventHandler;                 }             }         }*/    }}

外围代码分为四块:

1.加载数据 函数为 LoadData

2.点击新增行事件 函数为 AddRowBtn_Click

3.行新增事件【被动触发】 函数为 listDataGriddView_RowsAdded

4.单元格批改结束事件 函数为listDataGriddView_CellEndEdit

采坑1、数据绑定

listDataGriddView 是table的组件的name

this.listDataGriddView.DataSource 我抉择的是汇合, 已开始从数据库取出来空。只有这样的代码
this.listDataGriddView.DataSource = detailList; 如果detailList 是null 新增就能只能this.listDataGriddView.Rows.Add() 这个办法来新增行,
因为已开始的数据绑定就是个空 ,导致前面的新增 和删除 都要做判断 应用数据绑定和Rows 来新增和删除
【真的很麻烦】

这个因为如果绑定数据源【list】是不为null但长度是0的 ,一旦点击新增 后 点击行就会抛出 索引为-1的相干谬误。这个微软不晓得咋设计的。

采坑2、行事件触发bug

listDataGriddView_RowsAdded 的行新增触发的对象 有时候跟行数没有关系 感觉是外部机制的问题

所以:

         int maxCount = detailList != null && detailList.Count > ev.RowCount ? detailList.Count : ev.RowCount;        maxCount = ev.RowCount <= 1 ? ev.RowCount : maxCount;                这样能力避免汇合越界。            

采坑3、新增行和删除行的欠缺


采纳数据绑定 就能把如图的代码省略调,然而这个新增行会有bug,点一次会呈现两行,咱们须要设置enabled 属性为false 禁止他主动新增行,
等新增完 再把enabled 属性改为true.

采纳数据绑定 就能把如图的代码省略调,不须要判断是物理增加还是绑定数据源 一把从数据源中删除 ,只用执行
this,listDataGriddView.DataSource =null;this,listDataGriddView.DataSource =detaiList;两行代码

采坑4:所有的单元格、列都用name 不要用下标 【不然业务一边动 就会出很多bug 因为下标变动的可能性很大 但name个别不会】

采坑5: 联动的值 要在数据加载后设置,不然一开始在设计界面就设置了 如下拉框就匹配不上 就间接报错了,如果不是下拉框可能没什么问题

如下面的界面图,标段编号和分包名称就是联动的,如果须要标段有值 还得应用this.listDataGriddView.UpdateCellValue(markNoIndex, e.RowIndex);
去更新曾经设置的标段内容。

采坑6: 事件外面的 控件事件绑定

   /// <summary>       ///  从新定义编辑框       /// </summary>       /// <param name="sender"></param>       /// <param name="e"></param>       private void listDataGriddView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)       {           e.Control.Controls.Clear();           int colum = this.listDataGriddView.CurrentCell.ColumnIndex;           string columName = this.listDataGriddView.Columns[colum].Name;           if(e.Control is DataGridViewTextBoxEditingControl)           {               if (columName == "payTime")               {                   DateTimePicker btn = new DateTimePicker();                   e.Control.Controls.Add(btn);                   btn.Dock = DockStyle.Fill;                   btn.Cursor = Cursors.Default;                   btn.Format = DateTimePickerFormat.Custom;                   btn.CustomFormat = "yyyy-MM-dd";                   TableVo tableVo = new TableVo(this.listDataGriddView.CurrentCell.RowIndex, colum);                   btn.Tag = tableVo;//记录编辑的行和列                   btn.ValueChanged += SetCellValue;                   var cellValue = this.listDataGriddView.CurrentCell.Value;                   //btn.MaxDate = DateTime.Now;                   string pattern = @"\d{4}[/-]\d{1,2}[/-]\d{1,2}";                   Regex regex = new Regex(pattern);                   var defaultValue = DateTime.Now.ToString();                   defaultValue = regex.IsMatch(defaultValue) ? regex.Match(defaultValue).Groups[0].ToString() : defaultValue;                   this.listDataGriddView.CurrentCell.Value = cellValue != null ? cellValue : defaultValue;                   btn.Value = Convert.ToDateTime(this.listDataGriddView.CurrentCell.Value.ToString());                   //this.listDataGriddView.Rows[].Cells[this.listDataGriddView.CurrentColumn].Value = curValue;               }               else if ("depositMoney".Equals(columName) || "depositInsure".Equals(columName) || "totalMoney".Equals(columName))               {                   DataGridViewTextBoxEditingControl dgvTxt = (DataGridViewTextBoxEditingControl)e.Control; // 赋值                                                                                                              //dgvTxt.Name = columName;                   dgvTxt.KeyPress -= Cells_KeyPress; // 移除事件                                                                                             //dgvTxt.SelectAll();                   dgvTxt.KeyPress += Cells_KeyPress; // 绑定到事件                      //先让编辑框聚焦                   dgvTxt.Focus();                   //设置光标的地位到文本尾                   dgvTxt.Select(dgvTxt.TextLength, 0);                   //滚动到控件光标处                   dgvTxt.ScrollToCaret();               }               else               {                   DataGridViewTextBoxEditingControl dgvTxt = (DataGridViewTextBoxEditingControl)e.Control; // 赋值                     //RemoveEvent(dgvTxt.KeyPress);                                                                             //dgvTxt.Name = columName;                   dgvTxt.KeyPress -= Cells_KeyPress; // 移除事件                     /* dgvTxt.KeyPress -= Cells_KeyPress; // 移除事件                      dgvTxt.KeyPress -= Cells_KeyPress; // 移除事件   */               }           }

如下面的代码 是绑定Cells_KeyPress,这是我为了该输出 标准输出数字用到的

前面造成单号和备注都只能输出数字 ,就是因为 KeyPress的事件累加绑定了

本文来源于:宋文超super,专属平台有csdn、思否(SegmentFault)、 简书、 开源中国(oschina)、掘金,转载请注明出处。