如何向现有Winforms控件添加属性

gna*_*ket 8 .net c# properties groupbox winforms

我不确定这是否可行.我做了一些研究,但未能找到任何结论.还有一个类似的问题在这里,但它的WPF.

我想要做的是将自定义属性添加到我的表单上的现有WinForms GroupBox(或任何控件).对于此示例,我们将使用"链接".假设我程序中的每个GroupBox都包含一个超链接,然后我启动程序时需要做的就是这样做:

MyGroupBox.Link = "http:\\www.google.com\"
Run Code Online (Sandbox Code Playgroud)

稍后在我的程序中,我可以设置我的超链接内容来引用MyGroupBox.Link.

有可能像这样操纵Winforms控件吗?如果我不需要,我宁愿不做自定义控件.

我从这个问题中看到我可以扩展我的控制权,但在我的具体情况下我会如何看待?这与创建自定义控件相同吗?

ter*_*zio 7

一种方法是使用Extender Providers.当它添加到表单时,它就像ToolTip组件一样,它为该表单上的每个控件提供一个名为ToolTip的属性.您可以创建此类:

    [ProvideProperty("Link", typeof(Control))]
    public class ExtendControls : Component, IExtenderProvider
    {
        private Dictionary<Control, string> links =
                                   new Dictionary<Control, string>();

        public bool CanExtend(object extendee)
        {
            return !(extendee is Form);
        }

        public void SetLink(Control extendee, string value)
        {
            if (value.Length == 0)
            {
                links.Remove(extendee);
            }
            else
            { 
                links[extendee] = value; 
            }
        }

        [DisplayName("Link")]
        [ExtenderProvidedProperty()]
        public string GetLink(Control extendee)
        {
            if (links.ContainsKey(extendee))
            {
                return links[extendee];
            }
            else
            {
                return string.Empty;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

它的作用是为所有控件提供Link属性来处理表单.现在你在windowsforms项目中创建这个类并构建它,在你去工具箱中的表单设计器后你会看到extendcontrols组件拖动它在表单上,​​它将被放置在组件托盘中.几乎完成...接下来,您可以在所需控件的属性窗口中或在此类代码中使用新的链接属性(假设您将组件保留为默认值名称):

//assuming ofcourse you have a button called button1
//i used button as the example you can use panel,datagridview,label,etc...
//to set it...
extendControls1.SetLink(button1, "sometest");
//to get it back...
string myLink = extendControls1.GetLink(button1);
Run Code Online (Sandbox Code Playgroud)


edd*_*cat 6

我没有尝试使用GroupBox,但我想你可以在这里使用Button做类似的例子.

http://msdn.microsoft.com/en-us/library/7h62478z(v=vs.90).aspx

只需创建一个新类,称之为MyGroupBox或任何你想要的:

public class MyGroupBox : GroupBox {
    private string link;

    public string Link {get {return link;} set{link=value;} }
}
Run Code Online (Sandbox Code Playgroud)

这将继承GroupBox中的所有行为/属性,并为Link添加新属性.

然后你就可以这样使用它:

MyGroupBox groupBox = new MyGroupBox();
groupBox.Link = "www.google.com";
Run Code Online (Sandbox Code Playgroud)

我认为这比使用tag属性更清洁,老实说.主要是因为它不是标签,它是一个链接,我喜欢能够恰当地命名该属性.:)虽然如果你需要为许多控件而不仅仅是GroupBox执行此操作,标签可能会更容易.