C#VS2008显示编辑器,用于在设计时选择现有控件的集合

时间:2012-04-23 20:53:03

标签: c# user-controls design-time collectioneditor uitypeeditor

我的用户控件上有下一个属性:

[
    Browsable(true),
    Category("Data"),
    Description("Listado de controles que proporcionan los parámetros para generar el reporte."),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
]
public List<Control> ControlesParametros { set; get; }

我想让Visual Studio向我展示一个编辑器,我可以在我放置用户控件的表单中选择一些现有的控件实例。目前,Visual Studio向我展示了一个编辑器,我可以在其中添加新控件,但不能选择现有控件。

我找到了类似的问题和答案,但解决方案是使用.NET Framework 4.0设计的自定义编辑器,我目前有3.5: Design-time editor support for controls collection

是否有本地编辑器,或者我应该构建一个?

1 个答案:

答案 0 :(得分:0)

对于初学者,我会使用Collection<Control>代替List<T>。列表通常会起作用,但它会以您可能不需要的方式公开您的收藏。

要获取现有控件,您需要深入了解context.Container.Components覆盖中的LoadValues。它将包含所有,包括主机表单本身和组件,因此您可能必须过滤它们。有一点可以肯定的是删除组件(如DataGridViewColumnsTabPages),因为它们不会进入List或控件集合;像TableLayoutPanels这样的其他东西你也经常想要删除。

此版本过滤掉默认下拉列表的一些组件和控件:

protected override void LoadValues(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{

    bool bAdd = true;
    Control thisCtl = null;

    Collection<Control> tCollection = (Collection<Control>)value;

    foreach (object obj in context.Container.Components) {
        //Cycle through the components owned by the form in the designer
        bAdd = true;

        // exclude other components - this weeds out DataGridViewColumns which
        // can only be used by a DataGridView
        if (obj is Control) {
            thisCtl = (Control)obj;

            if (ExcludeForm) {
                bAdd = !(thisCtl is Form);
            }

            // custom exclude list 
            if ((typeExclude != null) && (typeExclude.Count > 0)) {
                if (typeExclude.Contains(thisCtl.GetType)) {
                    bAdd = false;
                }
            }

            bool bCheck = false;
            int ndx = 0;
            if (bAdd) {
                bCheck = tCollection.Contains(thisCtl);

                ndx = myCtl.Items.Add(new ListItem(thisCtl));
                myCtl.SetItemChecked(ndx, bCheck);
            }
        }

    }

}

enter image description here

如果您愿意,可以显示符合条件的控件对话框样式,并使用CheckedListBox为用户选择控件。有一篇关于CodeProject Selecting Form's Controls at Design Time的文章更详细。

它在VB中,但允许你很容易地轻松实现这样的野兽(我写了,所以我可能有偏见):

ExampleDropDownControlCollectionUIEditor : ControlCollectionDropDownUIEditor
{
    public ExampleDropDownControlCollectionUIEditor() : base()
    {
        base.ExcludeForm = true;

        base.CheckControlWidth = 200;

        base.typeExclude.Add(typeof(RadioButton));
        base.typeExclude.Add(typeof(Label));
    }
}

对话框表单很简单,只使用不同的基类ControlCollectionDialogUIEditor