一个简单的动态加载控件并保存控件信息的框架
2011-01-11 13:58
507 查看
当前要实现一个很多参数项要设置的界面,不多的模块需要不同个参数设置,考虑到不可能每个参数设置界面都做个配置界面吧,那样就太大工作量太大了,因此决定通过xml文件动态加载控件并布局,然后动态保存实现,这样即使增加一个参数或减少一个参数,一个配置界面都可以统一处理。定制一个接口,这个接口实现值管理和自己状态加载和序列化。如下:
然后通过类继承去实现需要实现的控件,比如Label继承类叫DyLabel,实现如下:
其中的Xml格式如下:
<DyLabel>
<Text>用户机ID</Text>
</DyLabel>
其余依次可以实现所有的控件DyTextBox等。最后用一个用户控件布局配置界面项,一般都是个DyLable和其他控件的组合,实现一个配置项类:DyControl
配置界面通过TableLayout布局,动态解析xml文件,实现保存等。欢迎交流。
public interface IControlObject { object Value { get; set; } IControlObject InitControl(string xml); string TagName { get; set; } String Save(); }
然后通过类继承去实现需要实现的控件,比如Label继承类叫DyLabel,实现如下:
public class DyLabel:System.Windows.Forms.Label,IControlObject { private string tagName = "DyLabel"; public object Value { get { return this.Text.Trim(); } set { this.Text = value.ToString(); } } /// <summary> /// 初始化控件 /// </summary> /// <param name="xml"></param> public IControlObject InitControl(string xml) { XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); XmlElement root = doc.DocumentElement; if (root.ChildNodes[0] != null && root.ChildNodes[0].InnerText != "") { this.Value = root.ChildNodes[0].InnerText; } return this; } /// <summary> /// 获取设置标签名称 /// </summary> public string TagName { get { return this.tagName; } set { this.tagName = value.ToString(); } } /// <summary> /// 保存自己 /// </summary> public String Save() { StringBuilder strB = new StringBuilder(); strB.Append("<"+this.tagName+">"); strB.Append("<Text>" + this.Value.ToString() + "</Text>"); strB.Append("</" + this.tagName + ">"); return strB.ToString(); } }
其中的Xml格式如下:
<DyLabel>
<Text>用户机ID</Text>
</DyLabel>
其余依次可以实现所有的控件DyTextBox等。最后用一个用户控件布局配置界面项,一般都是个DyLable和其他控件的组合,实现一个配置项类:DyControl
public partial class DyControl : UserControl { private List<IControlObject> lst = new List<IControlObject>(); public DyControl() { InitializeComponent(); } /// <summary> /// 初始化控件加载 /// </summary> public void InitControl(String xml) { XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); lst.Clear(); XmlElement root = doc.DocumentElement; XmlNodeList nodes = root.ChildNodes; for (int i = 0; i < nodes.Count; i++) { XmlNode node = nodes[i]; if (node.Name == "DyLabel") { DyLabel lb = new DyLabel(); lb.InitControl(node.OuterXml); this.label1.Text = lb.Value.ToString()+":"; lst.Add(lb); } else if(node.Name=="DyTextBox") { DyTextBox box = new DyTextBox(); box.InitControl(node.OuterXml); box.Dock = DockStyle.Fill; this.panel1.Controls.Add(box); lst.Add(box); } else if (node.Name == "DyComBox") { DyComBox box = new DyComBox(); box.InitControl(node.OuterXml); box.Dock = DockStyle.Fill; this.panel1.Controls.Add(box); lst.Add(box); } else if (node.Name == "DyCheckBox") { DyCheckBox box = new DyCheckBox(); box.InitControl(node.OuterXml); box.Dock = DockStyle.Fill; this.panel1.Controls.Add(box); lst.Add(box); } else if (node.Name == "DyNumericUpDown") { DyNumericUpDown box = new DyNumericUpDown(); box.InitControl(node.OuterXml); box.Dock = DockStyle.Fill; this.panel1.Controls.Add(box); lst.Add(box); } } } /// <summary> /// 保存控件 /// </summary> /// <returns></returns> public String Save() { StringBuilder strB = new StringBuilder(); strB.Append("<DyControl>"); for (int i = 0; i < lst.Count; i++) { string s = lst[i].Save(); strB.Append(s); } strB.Append("</DyControl>"); return strB.ToString(); } }
配置界面通过TableLayout布局,动态解析xml文件,实现保存等。欢迎交流。
相关文章推荐
- 一个简单的动态加载控件并保存控件信息的框架
- 一个简单到不行的loadingView加载控件小框架。
- vb6加载时提示出错,窗体log文件中错误信息为:控件 XX 的类 MSComctlLib.ListView 不是一个已加载的控件类。
- Scrapy框架结合Spynner采集需进行js,ajax动态加载的网页并提取网页信息(以采集微信公众号文章列表为例)
- 使用流加载和保存HTML内容&遍历html的信息存入一个ini文件&使用MSHTML分析HTML代码
- 使用流加载和保存HTML内容&遍历html的信息存入一个ini文件&使用MSHTML分析HTML代码
- 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机
- Winform开发框架之客户关系管理系统(CRM)的开发总结系列4-Tab控件页面的动态加载
- 一个服务器控件能自动保存/加载ASP.NET控件集 原著:Vishal Shukla
- 分享一个简单好用的下拉刷新、上拉加载控件
- 一个猜数字的小游戏—C# 控件的动态加载和应用 多线程
- 动态的为网页加载一个上传控件
- 简单的动态加载用户控件的方法
- 一个简单的完全信息动态博弈的解答
- 未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配。
- java异常信息保存的一个简单方法
- Android动态加载XML文件及控件来简单实现QQ好友印象的功能
- 【Visual Basic】纯代码不拖控件,利用动态生成控件的方式完成一个简单的四则运算计算器
- asp.net 动态创建TextBox控件 如何加载状态信息
- 未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配