使用的是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实现格式化
}
}