返回首页

您好

我尝试的ExtenderProviders遇到一个问题。

ExtenderProvider让您virtualy属性添加到现有的类。我的项目作为基类使用的控制。在的DesignTime,我需要一个窗体上的控件Control.Parent的参考。

为了说明这一点,假设你有以下的琐碎类ExtenderProvider(它不会做感兴趣的东西,除了说明)。这ExtenderProvider扩展Button类。我添加了两个按钮,表格,增加了ExtenderProvider(上弹出一前一后生成的工具箱)。该按钮具有的TestString财产如预期。

问题是,一旦代码为"的EndInit",每个按钮Control.Parent仍然没有设置。 InitializeComponent的建议,应设置。而且,在运行时,它被设置,但没有设计时间。

这是由设计呢?还是我做错了什么?

代码forExtenderProvider,(从我的表)的InitializeComponent抄录如下:


using System.ComponentModel;

using System.Windows.Forms;

using System.Collections.Generic;

 

namespace ExtenderProviderDemo

{

    [ProvideProperty("TestString", typeof(Button))]

    public class ExtenderProvider:Component, IExtenderProvider, ISupportInitialize

    {

        Dictionary<control,> testStrings = new Dictionary<control,string>();

 

        public ExtenderProvider() { }

 

        public string GetTestString (Control extendee) {  

            if(testStrings.ContainsKey(extendee))

                return testStrings[extendee];

            else

                return string.Empty;

        

        }

 

        public void SetTestString(Control extendee, string testString) {

            if (testStrings.ContainsKey(extendee)) {

                testStrings[extendee] = testString;

            }

 

            else

                testStrings.Add(extendee, testString);

        }

 

        #region IExtenderProvider Members

        public bool CanExtend(object extendee)  {

            return extendee is Button;

        }

        #endregion

 

        #region ISupportInitialize Members

 

        public void BeginInit()  {

        }

 

        public void EndInit() {

            foreach (KeyValuePair<control,> pair in testStrings) {

                MessageBox.Show("Control " + pair.Key.Name + " : Parent null ? " + (pair.Key.Parent == null).ToString());

            } 

        }

 

        #endregion

    }

}

 

private void InitializeComponent()

        {

            this.button1 = new System.Windows.Forms.Button();

            this.button2 = new System.Windows.Forms.Button();

            this.extenderProvider1 = new ExtenderProviderDemo.ExtenderProvider();

            ((System.ComponentModel.ISupportInitialize)(this.extenderProvider1)).BeginInit();

            this.SuspendLayout();

            // 

            // button1

            // 

            this.button1.Location = new System.Drawing.Point(102, 80);

            this.button1.Name = "button1";

            this.button1.Size = new System.Drawing.Size(75, 23);

            this.button1.TabIndex = 0;

            this.extenderProvider1.SetTestString(this.button1, "");

            this.button1.Text = "button1";

            this.button1.UseVisualStyleBackColor = true;

            // 

            // button2

            // 

            this.button2.Location = new System.Drawing.Point(115, 120);

            this.button2.Name = "button2";

            this.button2.Size = new System.Drawing.Size(75, 23);

            this.button2.TabIndex = 1;

            this.extenderProvider1.SetTestString(this.button2, "Test");

            this.button2.Text = "button2";

            this.button2.UseVisualStyleBackColor = true;

            // 

            // Form1

            // 

            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

            this.ClientSize = new System.Drawing.Size(284, 262);

            this.Controls.Add(this.button2);

            this.Controls.Add(this.button1);

            this.Name = "Form1";

            this.Text = "Form1";

            ((System.ComponentModel.ISupportInitialize)(this.extenderProvider1)).EndInit();

            this.ResumeLayout(false);

 

        }

 

回答

评论会员:Naerling 时间:2012/02/04
你说你从Control继承,但我看到组件
无论如何,它不应该的问题。
我觉得
我没有写,但它帮了我很多的时候创建一个自定义组件{S0}
除此之外,我看到一个]在InitializeComponent。这可能是一个问题。由于在InitializeComponent是自动生成的,它不会做太大的好处虽然对其进行编辑。
尝试链接到父表格。
希望它帮助,运气好的话
评论会员:!SAKryukov 时间:2012/02/04
问以防万一:

你知不知道,例如:

{C}
有严格的效果相同

this.button2.Parent = this;

mdash; SA