Здравствуйте. у меня есть контрол у которого есть, грубо говоря, два строковых свойства 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, с которым по сути сейчас и работает дизайнер студии, и из него и прочитать нужное значение. кто что посоветует?
|