关于c#:c-之winform-可编辑table-踩过的坑

85次阅读

共计 36270 个字符,预计需要花费 91 分钟才能阅读完成。

界面图:

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


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)、掘金,转载请注明出处。

正文完
 0