我们拥有什么
我们有一些复杂的winforms控件。要存储其状态,我们使用一些自定义序列化类。让我们说我们已经将它序列化为xml。现在我们可以将此xml保存为用户目录中的文件或将其包含在另一个文件中....
但是......
问题是,
如果用户在他的winform应用程序中创建了几个这样的控件(在设计时),最好使用哪个唯一标识符来知道哪些保存的配置属于哪些控件?
所以这个标识符应该:
我认为人们可以想象几种方法,我相信可能有一些默认的方法。
有什么好用的?为什么呢?
答案 0 :(得分:2)
这种小扩展方法可以完成工作:
public static class FormGetUniqueNameExtention
{
public static string GetFullName(this Control control)
{
if(control.Parent == null) return control.Name;
return control.Parent.GetFullName() + "." + control.Name;
}
}
返回类似' Form1._flowLayoutPanel.label1'
用法:
Control aaa;
Dictionary<string, ControlConfigs> configs;
...
configs[aaa.GetFullName()] = uniqueAaaConfig;
答案 1 :(得分:1)
我一直在使用由完整的控制层次结构树组成的复合标识符。假设您的表单名称是Form1,那么您有一个Groupbox Groupbox1和一个TextBox1文本框,复合标识符将是Form1 / Groupbox1 / TextBox1。
如果您想关注此内容,请参阅以下详细信息:
http://netpl.blogspot.com/2007/07/context-help-made-easy-revisited.html
答案 2 :(得分:1)
这是我最终创建的方法,用于定义一个唯一的名称,该名称包含表单的全名(带有它的命名空间),然后是相关控件上方的每个父控件。所以它最终可能会像:
MyCompany.Inventory.SomeForm1.SomeUserControl1.SomeGroupBox1.someTextBox1
static string GetUniqueName(Control c)
{
StringBuilder UniqueName = new StringBuilder();
UniqueName.Append(c.Name);
Form OwnerForm = c.FindForm();
//Start with the controls immediate parent;
Control Parent = c.Parent;
while (Parent != null)
{
if (Parent != OwnerForm)
{
//Insert the parent control name to the beginning of the unique name
UniqueName.Insert(0, Parent.Name + ".");
}
else
{
//Insert the form name along with it's namespace to the beginning of the unique name
UniqueName.Insert(0, OwnerForm.GetType() + ".");
}
//Advance to the next parent level.
Parent = Parent.Parent;
}
return UniqueName.ToString();
}