Color Combobox

Alkv
Дата: 04.05.2006 02:58:01
Создаю свой комбобокс в котором itemы будут квадратиками с цветами и в конструкторе заполняю его цветами переопределяю событие DrawItem все получилось красиво только вот бок, все цвета добавились по два раза.

вот код этого контрольчика:

	public class ColorComboBox : System.Windows.Forms.ComboBox
	{
		public ColorComboBox()
		{
			this.DrawMode = DrawMode.OwnerDrawFixed;
			this.DrawItem += new DrawItemEventHandler( OnDrawItem );
			this.SelectedIndexChanged += new System.EventHandler( OnSelectedIndexChanged );
			this.DropDown += new System.EventHandler( OnDropDown );	
			this.BackColor = Color.White;	
			this.ForeColor = Color.Black;
			Items.Clear();
			foreach(Color c in TypeDescriptor.GetConverter(typeof(Color)).GetStandardValues()) 
			{
				this.Items.Add(TypeDescriptor.GetConverter(c).ConvertToString(c));
			}
			this.SelectedIndex = 0;
			this.DropDownStyle = ComboBoxStyle.DropDownList;
		}

		private Color mSelectedColor = Color.Black;
		public Color SelectedColor
		{
			get
			{
				return mSelectedColor;
			}
			set
			{
				mSelectedColor = value;
				this.SelectedIndex = this.Items.IndexOf(GetStringFromColor(value));
			}
		}

		private void OnDrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
		{
			Graphics g = e.Graphics;
			Rectangle r = new Rectangle(e.Bounds.X + 2, e.Bounds.Y + 1,  
				e.Bounds.Width - 70, e.Bounds.Height - 4);
			Color BrushColor = e.Index == -1 ? Color.Black :GetColorFromString((string)this.Items[e.Index]); 
			g.FillRectangle(new SolidBrush(BrushColor), r);
			g.DrawRectangle(new Pen(Color.Black, 1), r);
			string ColorName = e.Index == -1 ? "Black" : (string)this.Items[e.Index];
			g.DrawString(ColorName, e.Font, new SolidBrush(Color.Black), 
			  new Rectangle(r.X + r.Width, r.Y, e.Bounds.Width, e.Bounds.Height));
		}

		private void OnSelectedIndexChanged(object sender, System.EventArgs e)
		{
			mSelectedColor = GetColorFromString((string)this.SelectedItem); 
		}

		private void OnDropDown(object sender, System.EventArgs e)
		{
			mSelectedColor = GetColorFromString((string)this.SelectedItem); 
		}	

		public string GetStringFromColor(Color color)
		{
			return TypeDescriptor.GetConverter(color).ConvertToString(color);
		}
 
		public Color GetColorFromString(string ColorName)
		{
			return ColorName == null ? Color.White : Color.FromName(ColorName); 
		}
	}

Так вот вопрос почему он все итемы дважды добавляет когда я его на форму ставлю???
Moristar
Дата: 04.05.2006 10:25:32
Возможно это вас удивит, но у МЕНЯ ВАШ код работает нормально. Единственно, я бы посоветовал сделать квадратик с цветом фиксированной ширины, а прирастягивании, увеличивать протранство для названия цвета, потому что не все надписи помещаются в комбо-бокс. А так вобще ничего...
Moristar
Дата: 04.05.2006 10:34:25
Вот собсно и измененный код, изменений понт, а выглядит во сто раз лучше:

private void OnDrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) {
	Graphics g = e.Graphics;
	Rectangle r = new Rectangle(e.Bounds.X + 2, e.Bounds.Y + 1,
		[b]e.Bounds.Width / 4[/b], e.Bounds.Height - 4);
	Color BrushColor = e.Index == -1 ? Color.Black : GetColorFromString((string)this.Items[e.Index]);
	g.FillRectangle(new SolidBrush(BrushColor), r);
	g.DrawRectangle(new Pen(Color.Black, 1), r);
	string ColorName = e.Index == -1 ? "Black" : (string)this.Items[e.Index];
	g.DrawString(ColorName, e.Font, new SolidBrush(Color.Black),
		  new Rectangle(r.X + r.Width + 5, r.Y, e.Bounds.Width, e.Bounds.Height));
}
Alkv
Дата: 04.05.2006 11:17:25
У вас какой фрэймворк?.. И что в вашем коде значит ??
Alkv
Дата: 04.05.2006 11:34:50
Сокмпилил код еще и во 2ом frameworke все равно итемсы добавляются дважды. Moristar посмотри внимательнее на то что получается в комбобоксе когда его на форму ставишь... Такое ощущение что он один раз их добавляет когда компилится, а второй раз когда форма создается.. У меня просто нет слов пробовал убрать ето

			Items.Clear();
			foreach(Color c in TypeDescriptor.GetConverter(typeof(Color)).GetStandardValues()) 
			{
				this.Items.Add(TypeDescriptor.GetConverter(c).ConvertToString(c));
			}
			this.SelectedIndex = 0;
			this.DropDownStyle = ComboBoxStyle.DropDownList;


в отдельный паблик метод:

		public void FillItems()
		{
			Items.Clear();
			foreach(Color c in TypeDescriptor.GetConverter(typeof(Color)).GetStandardValues()) 
			{
				this.Items.Add(TypeDescriptor.GetConverter(c).ConvertToString(c));
			}
			this.SelectedIndex = 0;
			this.DropDownStyle = ComboBoxStyle.DropDownList;
		}

потом его вызываю отдельно после того как контрол на форму поставил так все ок - итемсы один раз... В чем фича????
Alkv
Дата: 04.05.2006 11:46:42
Еще фича если в дизайн тайме на форме открыть итемсы этого комбобокса и все их удалить тогда тоже все работает нормально :)