2

有谁知道一个好的组件(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; }

     // ...
}

将其传递给此表单后,它将创建两个面板(“General”和“Advanced”),第一个面板上有一个 CheckBox 和一个 TextBox,第二个面板上有一个 ComboBox(包含所有可用的枚举)。

如果没有这样的控制,你们用什么?为每个选项手动添加、填充、格式化和绑定控件?

4

3 回答 3

2

我不知道有任何控件可以让你这样做,但你自己做并不难。最简单的方法是创建对话框外壳,作为选项“面板”的基类的用户控件,一个(或多个)属性来控制名称和分组信息,以及一个接口(用户控件实现) .

您的每个自定义选项面板都派生自用户控件并覆盖某种Initialize()Save()方法(由用户控件提供)。它还提供确定名称/分组信息的属性(或多个属性)。

在对话框外壳中,反射性地检查您的程序集(或所有已加载的程序集)中的所有公共类型,以查找实现您的接口的类型。找到类型后,获取属性以确定将其放置在分组中的位置(这里最简单的方法是使用树视图),调用 Activator.CreateInstance以创建用户控件的实例并将其存储在Tag属性中。当用户单击分组中的条目(树节点)时,获取Tag并将包含用户控件的面板设置为Tag属性中的对象。最后,当用户在对话框中单击“确定”时,循环遍历树节点,获取Tag属性并调用Save方法。

更新: 另一种选择是使用属性网格控件。它没有“漂亮”的 UI 外观,但功能非常强大,已经支持按类别属性进行分组,并且具有很大的灵活性。您可以使用显示所有选项的单个属性网格,或者使用可能基于类型的按主要功能(插件、功能等)分组的树视图的“混合”方法。当用户单击该节点时,为属性网格提供对象实例。这种方法的唯一缺点是,当对属性网格值进行更改时,它们是“实时的”,因为基础属性会立即更改,这意味着没有“取消”的概念

于 2009-10-10T13:12:59.323 回答
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
}
于 2009-10-10T13:14:58.397 回答
1

我偶然发现了类似的东西,我记得我前段时间遇到了这个问题,并认为我应该分享它。

这是一个简单的例子:http ://blog.denouter.net/2008/08/simple-reflection-form.html 。它使用反射根据对象的属性创建多个控件。

于 2010-09-09T07:43:32.967 回答