界面:只读、清空、验证为空、封装、赋值通用方法

 

使用的是DEV控件:根据上图实现在的只读、清空、验证为空、封装、赋值通用方法

 

//定义列控制全局变量      

 private const int _InputStartLenght = 2;//输入框的开始位置
        private const int _AsteriskStartLenght = 0;//星号的开始位置
        private const int _LeapLenght = 4;//递增长度
        /// <summary>
        /// 编辑区,是否只读
        /// </summary>
        /// <param name="readOnly">是否只读</param>
        protected void IsReadOnly(bool readOnly)
        {
            foreach (Control pnlCtrl in pnlInput.Controls)
            {
                if (pnlCtrl is XtraTableLayoutPanel)
                {
                    XtraTableLayoutPanel tlpInput = (XtraTableLayoutPanel)pnlCtrl;
                    for (int i = 0; i < tlpInput.RowCount; i++)//循环行
                    {//只循环有输入框的列
                        for (int j = _InputStartLenght; j < tlpInput.ColumnCount; )
                        {
                            //复选框跨了二列,所以一样的取
                            Control ctl = tlpInput.GetControlFromPosition(j, i);
                            if (ctl == null)//未取到控件,说明已经到了这一行的最后一个控件
                            {
                                break;//直接跳出这一行循环
                            }
                            if (ctl is XtraUserControl)
                            {
                                //因为是自定义控件,父类中没有ReadOnly属性,所以使用反射这种方式来调用
                                PropertyInfo pi = ctl.GetType().GetProperty("ReadOnly");
                                pi.SetValue(ctl, readOnly, null);
                            }
                            else
                            {
                                ((BaseEdit)ctl).Properties.ReadOnly = readOnly;
                            }
                            j = j + _LeapLenght;
                        }
                    }
                }
            }
        }


        /// <summary>
        /// 清除控件内容
        /// </summary>
        protected void Clear()
        {
            foreach (Control pnlCtrl in pnlInput.Controls)
            {
                if (pnlCtrl is XtraTableLayoutPanel)
                {
                    XtraTableLayoutPanel tlpInput = (XtraTableLayoutPanel)pnlCtrl;
                    for (int i = 0; i < tlpInput.RowCount; i++)//循环行
                    {//只循环有输入框的列
                        for (int j = _InputStartLenght; j < tlpInput.ColumnCount; )
                        {
                            //复选框跨了二列,所以一样的取
                            Control ctl = tlpInput.GetControlFromPosition(j, i);
                            if (ctl == null)//未取到控件,说明已经到了这一行的最后一个控件
                            {
                                break;//直接跳出这一行循环
                            }
                            if (ctl is XtraUserControl)
                            {
                                //方法一:自定义控件也支持EditValue,通过反射调用就OK,性能有点影响
                                PropertyInfo pi = ctl.GetType().GetProperty("EditValue");
                                pi.SetValue(ctl, null, null);
                                //方法二:自定义控件直接重写Text属性
                                //ctl.Text = null;
                                //方法三:推荐,加一接口,包含所有用户控件的共用属性和方法,所有的用户控件都去实现接口,就可以通过接口调用
                                //((IUserControl)ctl).EditValue = null;
                            }
                            else
                            {
                                ((BaseEdit)ctl).EditValue = null;
                            }
                            j = j + _LeapLenght;
                        }
                    }
                }
            }
        }

 

        /// <summary>
        /// 获取控件的值
        /// </summary>
        /// <param name="ctl">控件</param>
        /// <returns>控件中值</returns>
        private object GetControlValue(Control ctl)
        {
            object value;
            if (ctl is XtraUserControl)
            {
                //如果有自定义的控件,让自定义控件也支持EditValue就OK
                PropertyInfo pi = ctl.GetType().GetProperty("EditValue");
                value = pi.GetValue(ctl, null);
            }
            else
            {
                value = ((BaseEdit)ctl).EditValue;
                //如果是时间控件,可以继承时间控件重写EditValue实现格式化
            }
            return value;
        }


        /// <summary>
        /// 验证数据完整性
        /// </summary>
        /// <returns>是否验证通过</returns>
        protected bool ValidatorIsNull()
        {
            foreach (Control pnlCtrl in pnlInput.Controls)
            {
                if (pnlCtrl is XtraTableLayoutPanel)
                {
                    XtraTableLayoutPanel tlpInput = (XtraTableLayoutPanel)pnlCtrl;
                    for (int i = 0; i < tlpInput.RowCount; i++)//循环行
                    {//只循环有输入框的列
                        for (int j = _AsteriskStartLenght; j < tlpInput.ColumnCount; )
                        {
                            //取到星号控件
                            Control ctl = tlpInput.GetControlFromPosition(j, i);
                            if (ctl != null)
                            {
                                //往后跳两格取输入控件,验证
                                Control inputCtl = tlpInput.GetControlFromPosition(j + 2, i);

                               //防止在设计时复选框没有跨2列的情况

                                if (inputCtl == null)
                                {
                                    XtraMessageBox.Show(string.Format("在第{0}行{1}列找到不对控件", i + 1, j + 1), "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                                    return false;
                                }
                                //获取控件中值
                                object value = GetControlValue(inputCtl);

                                //判断值是否为空
                                if (value == null || string.IsNullOrEmpty(value.ToString()))
                                {
                                    //取到对应Lable中的文本,提示用户
                                    Control lblCtl = tlpInput.GetControlFromPosition(j + 1, i);
                                    XtraMessageBox.Show(lblCtl.Text + "不能为空", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                                    return false;
                                }
                            }
                            j = j + _LeapLenght;
                        }
                    }
                }
            }
            return true;
        }

 

        /// <summary>
        /// 根据表格中控件封装成指定类型实体
        /// </summary>
        /// <typeparam name="T">需要封装的实体类</typeparam>
        /// <param name="tlpContent">XtraTableLayoutPanel表格控件</param>
        /// <param name="continueCtl">不封装的控制名,没有则为null,控件名为小写</param>
        /// <returns>封装完成的实体对象</returns>
        protected T GetEntity<T>( List<string> continueCtlName)
        {
            Type t = typeof(T);
            PropertyInfo[] properties = t.GetProperties();
            T model = Activator.CreateInstance<T>();

            //封装实体
            foreach (Control pnlCtrl in pnlInput.Controls)
            {
                if (pnlCtrl is XtraTableLayoutPanel)
                {
                    XtraTableLayoutPanel tlpInput = (XtraTableLayoutPanel)pnlCtrl;
                    for (int i = 0; i < tlpInput.RowCount; i++)//循环行
                    {//只循环有输入框的列
                        for (int j = _InputStartLenght; j < tlpInput.ColumnCount; )
                        {
                            Control ctl = tlpInput.GetControlFromPosition(j, i);
                            if (ctl == null)
                            {
                                break;
                            }
                            string ctlName = ctl.Name.ToLower();
                            //跳过对应的控件
                            if ((continueCtlName != null && continueCtlName.Contains(ctlName)))
                            {
                                j = j + _LeapLenght;
                                continue;
                            }
                            //在属性数组中找到和控件对应的属性
                            foreach (PropertyInfo property in properties)
                            {
                                if (ctlName.Contains(property.Name.ToLower()))
                                {
                                    //取控件值赋值给属性
                                    object value = GetControlValue(ctl);
                                    property.SetValue(model, value, null);
                                    break;
                                }
                            }
                            j = j + _LeapLenght;
                        }
                    }
                }
            }
            return model;
        }

 

        /// <summary>
        /// 把数据行赋值到控件
        /// </summary>
        /// <param name="row">数据行</param>
        protected void SetControlValue(DataRow row)
        {
            //封装实体
            foreach (Control pnlCtrl in pnlInput.Controls)
            {
                if (pnlCtrl is XtraTableLayoutPanel)
                {
                    XtraTableLayoutPanel tlpInput = (XtraTableLayoutPanel)pnlCtrl;
                    for (int i = 0; i < tlpInput.RowCount; i++)//循环行
                    {//只循环有输入框的列
                        for (int j = _InputStartLenght; j < tlpInput.ColumnCount; )
                        {
                            Control ctl = tlpInput.GetControlFromPosition(j, i);
                            if (ctl == null)
                            {
                                break;
                            }
                            //从数据行中获取数据设置到控件中
                            string columnName = ctl.Name.Substring(3, ctl.Name.Length - 3);
                            SetControlValue(ctl, row[columnName]);
                            j = j + _LeapLenght;
                        }
                    }
                }
            }
        }


        /// <summary>
        /// 设置控件的值
        /// </summary>
        /// <param name="ctl">控件</param>
        /// <param name="value">值</param>
        private void SetControlValue(Control ctl, object value)
        {
            if (ctl is XtraUserControl)
            {
                //如果有自定义的控件,让自定义控件也支持EditValue就OK
                PropertyInfo pi = ctl.GetType().GetProperty("EditValue");
                pi.SetValue(ctl,value, null);
            }
            else
            {
                ((BaseEdit)ctl).EditValue = value;
                //如果是时间控件,可以继承时间控件重写EditValue实现格式化
            }
        }
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值