Winforms - Выполнить функцию, когда любая форма загружается в конструктор - PullRequest
2 голосов
/ 03 апреля 2012

Я работаю в winforms и пытаюсь связать некоторые события каждый раз, когда форма \ component \ usercontrol отображается в конструкторе, я пытаюсь связать некоторые статические события, которые загружают настройки из приложения .config файл.

Могу ли я определить код в моем проекте, который говорит: «Каждый раз, когда загружается элемент управления, выполните это событие?»

edit это строго время проектирования.

У меня есть базовая форма, в DLL "A". Это имеет массу свойств, «ColorLocation, SizeLocation», и тому подобное.

В DLL "B" у меня есть производная форма. Когда B загружается в конструктор, у меня был iEditorComponents (не помню точное имя), который позволяет пользователю выбирать ColorLocation из огромного списка элементов, указанных в файле настроек app.config для текущего проекта.

Проблема в том, что компонент редактирования находится в Dll "A", которая является базовой, и не имеет доступа к app.config в "B".

Мне нужно как-то сказать компоненту редактирования: «Эй, используйте этот список строк, чтобы заполнить свой элемент управления редактированием». Дизайнер делает все, что в его силах, он, кажется, не хочет выполнять какой-либо код в производных классах.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Да, это возможно, но убедитесь, что вы делаете, потому что звучит странно.

Используйте следующий код в конструкторе Form's или Control'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 голос
/ 03 апреля 2012

Я не знаю, будет ли это применяться к вашему конкретному случаю использования, но в какой-то момент мне понадобилось взаимодействовать с контейнером компонента (т. Е. С формой), поэтому я в итоге «украл» код из 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);
        }

    }

Надеюсь, это может помочь.

Cheers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...