您的位置:首页 > 其它

winform 程序对界面上控件的统一控制【二】组件版

2010-02-10 15:38 471 查看
  继上篇文章winform 程序对界面上控件的统一控制【一】(赋值\清空\验证……) ,本篇文章将实现一个同样功能的Component(组件)。

  先看看组件的实现,如下所示:

代码三public partial class FrmChoose : Form
{
public FrmChoose()
{
InitializeComponent();
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <param name="value"></param>
public FrmChoose(ITypeDescriptorContext context, List<RealSailing.UI.Utils.SetControl> value)
{
InitializeComponent();
this.SetStyle(System.Windows.Forms.ControlStyles.DoubleBuffer | System.Windows.Forms.ControlStyles.UserPaint | System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, true);
this.BackColor = System.Drawing.SystemColors.Control;
if (0 != value.Count)
{
control = value;
foreach (object c in context.Container.Components)
{
if (c.GetType().BaseType.Equals(typeof(RealSailing.DataSet.BaseDataSet)))
FillCombFiled(context, c);
}
}
else
{
RealSailing.UI.Utils.SetControl setControl;
foreach (object c in context.Container.Components)
{
if (arrType.Contains(c.GetType()))
{
setControl = new RealSailing.UI.Utils.SetControl
{
ControlName = c,
NullAble = false,
Default = null,
Formate = "",
KeyFiled = false,
FiledName = ""
};
control.Add(setControl);
}
else if (c.GetType().BaseType.Equals(typeof(RealSailing.DataSet.BaseDataSet)))
{
FillCombFiled(context, c);
}
}
}
this.gcSelect.DataSource = control;
}
/// <summary>
/// 用数据集中的列填充ComboBoxEdit控件
/// </summary>
/// <param name="context"></param>
/// <param name="c"></param>
private void FillCombFiled(ITypeDescriptorContext context, object c)
{
RealSailing.DataSet.BaseDataSet myDs = c as RealSailing.DataSet.BaseDataSet;
Type t = context.Instance.GetType();
System.Reflection.PropertyInfo p = t.GetProperty("DataMember");
object obj = p.GetValue(context.Instance, null);
string table = obj == null ? "" : obj.ToString();

if (myDs != null && !string.IsNullOrEmpty(table))
{
DataColumnCollection cols = myDs.Tables.Columns;
if(!cols.Contains(" "))
cols.Add(" ", typeof(string));
combFiled.Items.Clear();
foreach (DataColumn col in cols)
{
combFiled.Items.Add(col.ColumnName);
}
}
}
/// <summary>
/// 验证控件类型
/// </summary>
ArrayList arrType = new ArrayList
{
typeof(DevExpress.XtraEditors.LookUpEdit),
typeof(DevExpress.XtraEditors.TextEdit),
typeof(DevExpress.XtraEditors.DateEdit),
typeof(DevExpress.XtraEditors.ComboBoxEdit),
typeof(RealSailing.UI.Common.UCSysParaslkEdit),
typeof(RealSailing.UI.Control.TextBoxEx),
typeof(RealSailing.UI.Control.MemoEditEx),
typeof(RealSailing.UI.Common.UCComboBox),
typeof(RealSailing.UI.Control.PopuLookUpedit),
typeof(RealSailing.UI.Control.UCTextEdit)
};
/// <summary>
/// 控件验证项
/// </summary>
List<RealSailing.UI.Utils.SetControl> control = new List<RealSailing.UI.Utils.SetControl>();

/// <summary>
/// 设置的值
/// </summary>
public List<RealSailing.UI.Utils.SetControl> Value
{
get
{
return control;
}
}

private void btnOk_Click(object sender, EventArgs e)
{
this.Refresh();
this.Close();
}

private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
}  说明:

  (1)该窗体上只包括一个GridControl(Devexpress)控件,并且在gridview中添加了一个ComboBoxEdit控件,用于选择该控件所绑定到的字段(前提是给CtrlValidation类型中的DataSource何DataMember属性赋过值,本类型中的FillCombFiled方法会通过反射,获取DataSet中DataTable的列,从而绑定到Gridview中ComboBoxEdit控件的Items属性中)。

  (2)窗体中定义了一个ArrayList类型的arrType,该ArrayList中存放的是控件的类型,表名只对该类型的控件做处理,而其他类型的控件则不作处理。

  (3)在FrmChoose有参构造函数中,会更具组件CtrlValidation的上下文,遍历窗体上的所有控件,并且将控件类型在arrType列表中的控件,添加到控件集合control中。

  实现效果如图1示:


                                    图1

  这种的实现方式,比较上篇blog的实现方式,更加的方便。 在窗体设计时,将CtrlValidation组件拖入,便会自动加载需要控制的控件(有arrType列表中的控件类型决定)。在CtrlValidation属性中,设置集合属性CtrlCollect,将会弹出如图1所示的画面。点击确定完成控制属性的设置。再就可以调用该组件另外的8个功能函数。

  本篇blog主要是为了阐述如何开发组件,如何给组件定义可视的属性,并且定义集合属性。但愿我讲清楚了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐