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

时间:2014-07-14 21:07:55

标签: c# .net winforms properties groupbox

我不确定这是否可行。我做了一些研究,但未能找到任何结论。有一个类似的问题here,但它适用于WPF。

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

MyGroupBox.Link = "http:\\www.google.com\"

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

是否可以像这样操纵Winforms控件?如果我不需要,我宁愿不进行自定义控制。

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

3 个答案:

答案 0 :(得分: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;} }
}

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

然后你可以这样使用它:

MyGroupBox groupBox = new MyGroupBox();
groupBox.Link = "www.google.com";

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

答案 1 :(得分:6)

一种方法是使用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;
            }
        }
    }

它的作用是为所有控件提供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);

答案 2 :(得分:0)

为了回应Savanna,您可以使用Savanna描述的方法创建扩展类,然后将实际类拖到工具箱中。奇怪的是,你可以在你的工具箱中拥有它,准备好在设计师模式下拖动到你的表单,完成你添加的任何自定义属性。