Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> в Control выставить одно свойства от другого, WinForms, 2005 
:(
    Опции темы
Mr_Smith
Дата 11.4.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 27.4.2007

Репутация: нет
Всего: нет



Здравствуйте. у меня есть контрол у которого есть, грубо говоря, два строковых свойства ControlName и ControlPropertyName, значения которых должны устанавливаться из списков, создаваемых динамически. 

в дизайнтайме ControlName выбирается из списка контролов, которые сейчас находятся на форме, а  список значений для ControlPropertyName, по идее, должен заполняться публичными свойствами контрола, выбранного в предыдущем свойстве.

т.е. установили сначала контрол какой-нить, потом указали свойство этого контрола.
например в ControlName выбрали какой-нить "Button1", следовательно в списке ControlPropertyName
должны появиться "Text", "Name", "Color"и прочие свойства  Button1.



сделано таким макаром все:
Код

    [Serializable]
    [TypeConverter(typeof(ReportFrm.Design.PropertyItemTypeConverter))]
    public class FormPropertyItem : IComparable
    {
        #region Members
        private string strControlName = "";
        private string strControlPropertyName = "";
        private byte[] strControlValue = null;
        private bool isnullassign = false;
        #endregion

        #region Propetires
        [TypeConverter(typeof(FormControlsConverter))]
        [Browsable(true), Description("Наименование контрола")]
        public string ControlName
        {
            get
            {
                return strControlName;
            }
            set
            {
                strControlName = value;
            }
        }
        [Browsable(true), Description("Свойство контрола")]
        public string ControlPropertyName
        {
            get
            {
                return strControlPropertyName;
            }
            set
            {
                strControlPropertyName = value;
            }
        }
        [Browsable(true), Description("Поддерживает ли свойство неопредленные значения?"), DefaultValue(false)]
        public bool IsNullAssign
        {
            get
            {
                return isnullassign;
            }
            set
            {
                isnullassign = value;
            }
        }
        [Browsable(false)]
        public byte[] ControlValue
        {
            get
            {
                return strControlValue;
            }
            set
            {
                strControlValue = value;
            }
        }
        [Browsable(false)]
        public bool IsNullAssignDefault
        {
            get
            {
                return false;
            }
        }
        #endregion

        #region Methods
        public FormPropertyItem()
        {
        }

        public FormPropertyItem(string CtrlName, string CtrlPropName)
        {
            strControlName = CtrlName;
            strControlPropertyName = CtrlPropName;
        }
        
        public FormPropertyItem(string CtrlName, string CtrlPropName, bool isnull)
        {
            strControlName = CtrlName;
            strControlPropertyName = CtrlPropName;
            isnullassign = isnull;
        }

        public override bool Equals(object obj)
        {
            if(CompareTo(obj) == 0)
                return true;
            else return false;
        }

        public override int GetHashCode()
        {
            Random rnd = new Random();
            String solt = String.IsNullOrEmpty(strControlName) ? rnd.NextDouble().ToString() : strControlName;
            solt += String.IsNullOrEmpty(strControlPropertyName) ? rnd.NextDouble().ToString() : strControlPropertyName;
            int i, j = 0;
            char[] letters = solt.ToCharArray();
            i = letters[0];
            for(j = 1; j < letters.Length; j++)
                i = (i + letters[j]) >> 1;

            return i;
        }


        #endregion

        #region IComparable Members

        public int CompareTo(object obj)
        {
            if(obj is FormPropertyItem)
            {
                if(((FormPropertyItem)obj).ControlName == this.ControlName &&
                    ((FormPropertyItem)obj).ControlPropertyName == this.ControlPropertyName)
                    return 0;
            }
            else
            {
                throw new ArgumentException("Неправильный тип для сравнения");
            }
            //TODO это криво. Надо сделать полное сравнение
            return -1;
        }

        #endregion
    }





    /// <summary>
    /// TypeConverter для списка контролов на форме
    /// </summary>
    public class FormControlsConverter : StringConverter
    {
        /// <summary>
        /// Будем предоставлять выбор из списка
        /// </summary>
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        /// <summary>
        /// ... и только из списка
        /// </summary>
        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            // false - можно вводить вручную
            // true - только выбор из списка
            return true;
        }

        /// <summary>
        /// А вот и список
        /// </summary>
        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            System.Collections.Specialized.StringCollection scItems = new System.Collections.Specialized.StringCollection();
            
            if(context != null)
            {
                Form frm = null;
                String[] asItems = null;
                IDesignerHost idh = context.GetService(typeof(IDesignerHost)) as IDesignerHost;
                if(idh != null)
                    frm = idh.RootComponent as Form;
                if(frm != null)
                {
                    int i = 0;
                    asItems = new String[frm.Controls.Count];
                    foreach(Control c in frm.Controls)
                        asItems[i++] = c.Name;
                }

                if(asItems != null)
                {
                    Array.Sort(asItems);
                    scItems.AddRange(asItems);
                }
            }
            // возвращаем список строк 
            return new StandardValuesCollection(scItems);
        }
    }
 

вопрос в том, как передать второму свойству (ControlPropertyName) выбранное значение в ControlName ?

есть задумка, что это делается путем написания  StringConverter  теперь для свойства ControlPropertyName, в котором надо получить мой исходный объект FormPropertyItem, с которым по сути сейчас и работает дизайнер студии, и из него и прочитать нужное значение.


кто что посоветует? 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0673 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.