DevExpres.XtraLayout控件运行时动态设置数据项

问题分析:

         通常、我们使用XtraLayout控件,是需要做以下的几个步骤来实现的:

1、  在窗体上拖拉一个 LayoutControl控件,设置它的填充属性;

2、  拖拉一些常规编辑控件到LayoutControl中去,这个时候我们会发现LayoutControl中除了增加了我们拖拉的常规编辑控件之后、还多了一些layoutControlItem组件;

3、  设置layoutControlItem的标签属性(text属性);

4、  设置我们拖拉的常规编辑控件的相关属性,如DataBindings数据源属性、可见属性、可用(Enable)属性、可用(Visible)属性等;

对于以上问题,1和2是很简单的,我们直接在设计器中拖拉一下控件,然后命名它们就可以了。为了后面程序的方便,我们这里给定一个规则:LayoutControlItem组件我们命名时,以某一个特定的字符串作为前缀,后面加上数据表的字段名称。在我们给出的示例项目中,我们以“Lab_”作为名字的前缀,例如对于字段“FieldName”对应的LayoutControlItem,我们命名为 “Lab_ FieldName”。

接下来,我们用代码实现对这些LayoutControlItem的属性根据我们在数据字典中的设置进行赋值即可。

 

具体代码实现:(限于篇幅、这里我只给出ComboBox控件的部分代码,更多代码请查阅示例项目源码,不便之处请见谅。)

1、  设置LayoutControlItem控件的Caption属性以及相关参数的方法:

 

……

case "ComboBox":

     {

         if ((lc.Items[itemindex] as DevExpress.XtraLayout.LayoutControlItem).Control is DevExpress.XtraEditors.ComboBoxEdit)

         {

        ……

             if (QueryListStr != "")

             {

                 if ((QueryListStr.ToLower().Contains("select")) && (QueryListStr.ToLower().Contains("from")))//如果数据字典中设置的是SQL查询语句,则执行之读取相应的查询表数据;

                 {

                     try

                     {

                         string sqltxt = (QueryListStr);

                         dtvalue = ExecSqlQuery(sqltxt);

                     }

                     catch (Exception msg)

                     {

                         throw new Exception("执行SQL语句错误[" + QueryListStr + "]" + msg.Message.ToString());

                     }

                     cb.Properties.Items.Clear();

                     bool isHasEmptyValue = false;

                     for (int k = 0; k < dtvalue.Rows.Count; k++)

                     {//把读取到的查询表数据添加到下拉控件的列表中;

                         cb.Properties.Items.Add(dtvalue.Rows[k][0].ToString());

                         if (dtvalue.Rows[k][0].ToString().Trim() == string.Empty) isHasEmptyValue = true;

                     }

                     if (! isHasEmptyValue) cb.Properties.Items.Add(string.Empty);

                 }

             ……

2、    接下来设置控件的DataBindingSource数据源,这是LayoutControlItem控件是否能正确显示数据的关键方法。

            p = c.GetType().GetProperty(PropertyType[i]);//逐一尝试得到控件的属性类型;

            if (p == null) continue;//如果没有能够获取,说明该控件不具备相应的属性,则继续尝试下一组属性;

            c.DataBindings.Clear();//如果取得了对应的属性,则先清除原有的默认设置

            c.DataBindings.Add(PropertyType[i], dt, FieldName);//根据数据字典的设置对控件的属性进行设置。

 

 

 

好了,到此,我们已经准备好了必要的方法,要调用这些对一个LayoutControl进行设置,我们只需在任何我们需要的地方调用我们写好的方法即可:

LFH.Function.FuncLayoutControl.SetFieldLabel("Lab_", layoutControl1, MyDT, DevExpress.Utils.HorzAlignment.Near);

LFH.Function.FuncLayoutControl.SetLayoutDataBind(layoutControl1, myBS, "Lab_");

附图:在运行期间进行读写模式、只读模式、隐藏控件三种模式下的程序界面图。

 

 源码不在这里贴了、有兴趣的朋友下载了自己看吧。

 https://files.cnblogs.com/HebiZiyu/%E7%A4%BA%E4%BE%8B%E9%A1%B9%E7%9B%AE%E6%BA%90%E7%A0%81.rar

posted @ 2013-11-20 09:13  紫雨(HB)  阅读(563)  评论(0编辑  收藏  举报