Можно ли изменить имя компонента в конструкторе компонентов в WinForms .Net - PullRequest
3 голосов
/ 08 января 2010

Я создал компонент, имя которого я хотел бы изменить при редактировании в области компонентов. Я добавил действие Designer для свойства name, но теперь застрял.

Глядя на сетку свойств, я вижу, что свойство name заключено в скобки, что указывает на то, что это свойство не является обычным.

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 22 февраля 2016

Вы можете изменить имя 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;
        }
    }
}
0 голосов
/ 25 января 2010

Некоторые свойства являются специальными в среде разработки, и вы можете установить их только через дескриптор типа. Это может быть в случае с именем, но, безусловно, это относится к таким вещам, как 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);
        }
    }
...