您的位置:首页 > 其它

一个简单的动态加载控件并保存控件信息的框架

2011-01-11 13:58 507 查看
当前要实现一个很多参数项要设置的界面,不多的模块需要不同个参数设置,考虑到不可能每个参数设置界面都做个配置界面吧,那样就太大工作量太大了,因此决定通过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文件,实现保存等。欢迎交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐