是否可以在WinForms .Net中更改组件设计器中的组件名称

时间:2010-01-08 13:26:18

标签: c# .net vb.net winforms windows-forms-designer

我创建了一个组件,我希望在组件托盘中进行编辑时可以更改其名称。 我为名称属性添加了一个Designer动作,但现在我被卡住了。

查看属性网格,我可以看到name属性是带括号的,表明它不是常规属性。

这可能吗?

2 个答案:

答案 0 :(得分:1)

您可以使用Component在设计时更改Component.Site.Name的名称。您应该将代码放在try / catch块中,以便在名称重复时处理异常。

<强>代码:

为组件实现设计器时,在设计时更改组件名称的man代码为:

this.Component.Site.Name = "SomeName";

以下是组件和组件设计器的完整实现。组件设计器有一个动词,当你右键单击组件时可以访问它,也可以从命令栏中的属性网格访问它。单击Rename命令时,它会将组件名称设置为SomeName。如果存在具有相同名称的组件,它还会显示错误消息。在更现实的示例中,您可以覆盖ActionLists以让用户自己输入新名称。

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms.Design;

[Designer(typeof(MyComponentDesigner))]
public class MyComponent : Component
{
    public string SomeProperty { get; set; }
}

public class MyComponentDesigner : ComponentDesigner
{
    DesignerVerbCollection verbs;
    public MyComponentDesigner() : base() { }
    public override DesignerVerbCollection Verbs
    {
        get
        {
            if (verbs == null)
            {
                verbs = new DesignerVerbCollection();
                verbs.Add(new DesignerVerb("Rename", (s, e) =>
                {
                    try
                    {
                        this.Component.Site.Name = "SomeName";
                        this.RaiseComponentChanged(null, null, null);
                    }
                    catch (Exception ex)
                    {
                        var svc = ((IUIService)this.GetService(typeof(IUIService)));
                        svc.ShowError(ex);
                    }
                }));
            }
            return verbs;
        }
    }
}

答案 1 :(得分:0)

某些属性在设计环境中很特殊,您只能通过类型描述符设置它们。这可能是名称的情况,但对于Visible,Locked和Enabled这样的情况肯定是这种情况。也许这会给你一些值得关注的东西。

SetHiddenValue(control, "Visible", false);
SetHiddenValue(control, "Locked", true);
SetHiddenValue(control, "Enabled", false);

    /// <summary>
    /// Sets the hidden value - these are held in the type descriptor properties.
    /// </summary>
    /// <param name="control">The control.</param>
    /// <param name="name">The name.</param>
    /// <param name="val">The val.</param>
    private static void SetHiddenValue(Control control, string name, object val)
    {
        PropertyDescriptor descriptor = TypeDescriptor.GetProperties(control)[name];
        if (descriptor != null)
        {
            descriptor.SetValue(control, val);
        }
    }