有没有人知道一个好的组件(C#WinForms)允许创建一个选项(设置)表单,给定一个带有一堆属性的自定义类?我不是在寻找一些闪亮的东西,而是一种仅仅比房产网格更好的东西。我可以很容易地处理视觉部分,但我只是不想浪费时间进行反射添加和绑定控件(如果它已经存在)。
我很确定我以前在某个地方看过一个类似Visual Studio的选项,它是动态创建的(有一些属性附加到类的属性,以允许分组和其他信息)。
[编辑] 例如,我可能有一个选项类:
public class Options : SerializableOptions<Options>
{
[Category("General")]
[Name("User name")]
[Description("Some text")]
public string Username { get; set; }
[Category("General")]
[Name("Log in automatically")]
public bool LogInAutomatically { get; set; }
[Category("Advanced")]
// ConnectionType is enum
public ConnectionType ConnectionType { get; set; }
// ...
}
将其传递给此表单后,它将创建两个面板(“常规”和“高级”),在第一个面板上有一个CheckBox和一个TextBox,在第二个面板上有一个ComboBox(包含所有可用的枚举)。
如果没有这样的控制,你们用什么?为每个选项手动添加,填充,格式化和绑定控件?
答案 0 :(得分:2)
我不知道任何允许你这样做的控件,但是你自己并不难。最简单的方法是创建对话框shell,一个用户控件,作为选项“面板”的基类,一个(或多个)属性来控制名称和分组信息,以及一个接口(用户控件实现)
每个自定义选项面板都来自用户控件,并覆盖某种Initialize()
和Save()
方法(由用户控件提供)。它还提供了确定名称/分组信息的属性(或属性)。
在对话框shell中,反射性地检查程序集(或所有已加载的程序集)中的所有公共类型,以查找实现接口的类型。当您找到类型时,获取属性以确定将其放置在分组中的位置(这里最简单的方法是使用树视图),调用Activator.CreateInstance
来创建用户控件的实例并将其存储在{ {1}}财产。当用户单击分组中的条目(树节点)时,获取Tag
并将包含用户控件的面板设置为Tag
属性中的对象。最后,当用户在对话框中单击“确定”时,循环遍历树节点,获取Tag
属性并调用Tag
方法。
<强>更新强> 另一种选择是使用属性网格控件。它没有“漂亮”的UI外观,但功能非常强大,已经支持按类别属性进行分组,并且具有很大的灵活性。您可以使用显示所有选项的单个属性网格,或者使用“混合”方法,使用树视图按主要功能(插件,功能等)进行分组,可能基于类型。当用户单击该节点时,为属性网格指定对象实例。这种方法的唯一缺点是,当对属性网格值进行更改时,它们是“活动的”,因为底层属性会立即更改,这意味着没有“取消”的概念,不能保存每个值的副本,可以自己改变并执行某种类型的“重置”。
答案 1 :(得分:1)
我不知道是否存在这样的控件,但编写所需的反射代码并不是那么难。例如。像这样的东西:
// the class for which to create an UI
public class MyClass
{
public string Text { get; set; }
public int ID { get; set; }
}
...
// basic reflection code to build the UI for an object
var obj = new MyClass() { Text="some text", ID=3};
foreach (var pi in obj.GetType().GetProperties())
{
var name = pi.Name;
var type = pi.PropertyType;
var value = pi.GetValue(obj, null);
//now setup the UI control for this property and display the value
}
答案 2 :(得分:1)
我偶然发现了类似的东西,我记得我刚才有这个问题,并认为我应该分享它。
这是一个简单的例子:http://blog.denouter.net/2008/08/simple-reflection-form.html。它使用反射根据对象的属性创建多个控件。