Winforms - 在将任何表单加载到设计器中时执行函数

时间:2012-04-03 16:42:31

标签: c# winforms configuration-files designer

我正在使用winforms,并且我试图在设计器中显示form \ component \ usercontrol的任何时候链接某些事件,我试图链接一些从应用程序加载首选项的静态事件.config文件。

我是否可以在我的项目中定义代码“任何时候加载控件,执行此事件?”

编辑这绝对是设计时间。

我有一个基本表单,在DLL“A”中。这有很多属性,“ColorLocation,SizeLocation”,以及那种性质的东西。

在DLL“B”中,我有一个派生形式。当B加载到设计器中时,我有iEditorComponents(不记得确切名称),允许用户从当前项目的app.config设置文件中指定的大量项目中选择ColorLocation。

问题是,编辑组件在Dll“A”中,它是基础,并且它无法访问“B”中的app.config。

我需要告诉编辑组件“嘿,使用这个字符串列表来填充你的编辑控件”。设计师正在尽其所能,似乎不想在派生类中执行任何代码。

2 个答案:

答案 0 :(得分:3)

是的,这是可能的,但要确保你在做什么,因为听起来很奇怪。

Form'sControl's构造函数中使用以下代码:

    public void Form1()
    {
       InitializeComponent();

       if (IsInWinFormsDesignMode())
       {
           // your code stuff here
       }
    }

    public static bool IsInWinFormsDesignMode()
    {
        bool returnValue = false;

        #if DEBUG  

        if ( System.ComponentModel.LicenseManager.UsageMode == 
             System.ComponentModel.LicenseUsageMode.Designtime )
        {
            returnValue = true;
        }

        #endif

        return returnValue;
    }

希望它有所帮助。

答案 1 :(得分:1)

我不知道这是否适用于您的特定用例,但在某个时间点我需要与Component的容器(即表单)进行交互,因此我最终从ErrorProvider“窃取”代码:

//code goes in your Component/Control

 private ContainerControl _containerControl = null;

 //Will contain a reference to the Form hosting this Component
        public ContainerControl ContainerControl
        {
            get { return _containerControl; }
            set { _containerControl = value; 
                 //In here setup what you need from the Form
                 //for example add a handler
                }
        }

        //Allows the VS.NET designer to set the ContainerControl
        //in the designer code. Stolen from ErrorProvider.
        public override ISite Site
        {
            set
            {
                base.Site = value;
                if (value != null)
                {
                    IDesignerHost host = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
                    if (host != null)
                    {
                        IComponent rootComponent = host.RootComponent;
                        if (rootComponent is ContainerControl)
                        {
                            this.ContainerControl = (ContainerControl)rootComponent;
                        }
                    }
                }
            }
        }

我还使用StringConverter派生类与Designer中的外部资源进行交互:

public class OpcDotNetTagConverter : StringConverter
    {
        #region Make It A ComboBox
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }
        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            return false;
        }
        #endregion

        #region Display Tags In List
        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            if ((context == null) || (context.Container == null))
            {
                return null;
            }

            Object[] Tags = this.GetTagsFromServer(context);
            if (Tags != null)
            {
                return new StandardValuesCollection(Tags);
            }
            return null;
        }

        private object[] GetTagsFromServer(ITypeDescriptorContext context)
        {
            List<string> availableTags = new List<string>();

            if (context.Instance == null)
            {
                availableTags.Add("ITypeDescriptorContext.Instance is null");
                return availableTags.ToArray();
            }


            Interfaces.IOpcDotNetServerEnabled inst = context.Instance as Interfaces.IOpcDotNetServerEnabled;
            if (inst == null)
            {
                availableTags.Add(context.Instance.ToString());
                return availableTags.ToArray();
            }

            if (inst.OpcDotNetServer == null)
            {
                availableTags.Add("No server selected");
                return availableTags.ToArray();
            }

            availableTags = inst.OpcDotNetServer.GetTagList(string.Empty);
            availableTags.Sort(Comparer<string>.Default);
            return availableTags.ToArray();
        }

        #endregion

        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if(sourceType == typeof(string))
                return true;
            return base.CanConvertFrom(context, sourceType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            if (value is string)
                return value.ToString();
            return base.ConvertFrom(context, culture, value);
        }

    }

我希望这可以提供一些帮助。

干杯