开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 5183|回复: 0

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

[复制链接]

0

精华

9

贡献

41

赞扬

帖子
68
软币
1133
在线时间
157 小时
注册时间
2013-9-3
发表于 2013-11-19 10:14:09 | 显示全部楼层 |阅读模式
注意:本系列文章首发于 《电脑编程技巧与维护》,感兴趣的朋友可以去该杂志社网站下载示例代码。

         通常、我们使用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] asDevExpress.XtraLayout.LayoutControlItem).Control isDevExpress.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 newException("执行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);//逐一尝试得到控件的属性类型;
            if (p == null) continue;//如果没有能够获取,说明该控件不具备相应的属性,则继续尝试下一组属性;
            c.DataBindings.Clear();//如果取得了对应的属性,则先清除原有的默认设置
            c.DataBindings.Add(PropertyType,dt, FieldName);//根据数据字典的设置对控件的属性进行设置。
好了,到此,我们已经准备好了必要的方法,要调用这些对一个LayoutControl进行设置,我们只需在任何我们需要的地方调用我们写好的方法即可:
LFH.Function.FuncLayoutControl.SetFieldLabel("Lab_",layoutControl1, MyDT, DevExpress.Utils.HorzAlignment.Near);
LFH.Function.FuncLayoutControl.SetLayoutDataBind(layoutControl1,myBS, "Lab_");
附图:在运行期间进行读写模式、只读模式、隐藏控件三种模式下的程序界面图。
file:///C:/Users/Ziyu/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg file:///C:/Users/Ziyu/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg file:///C:/Users/Ziyu/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
要想在程序运行期间动态设置控件属性来提高效率,一个很重要的问题是我们必须吃透控件正确运行需要哪些必须的属性设置,有了这个基础,用代码去做才有可能。至于相关设置信息是以数据表的形式存在或者以xml配置文件的形式存在,就要依据具体的项目需求来具体安排了。这是见仁见智的问题,本文旨在给大家提供一个思路。希望能够给朋友们一些启发。
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-12-22 20:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表