C# combox的多选情况

combox是一个功能很强大的控件。它可以使得枚举类型的值给用户提供很好的选择使用。

但是在现实的使用过程中发现,有时候它的功能不能满足我们的要求了。

例如,有时我们需要选择多项时,就发现combox本身是单选类型的。这时候我们就要扩展一下这个控件了

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace ComboBoxEx
{
public class ComboBoxEx:ComboBox
{
ListBox lst
=new ListBox();
public ComboBoxEx()
{
lst.SelectionMode
=SelectionMode.MultiExtended;
this.DrawMode=DrawMode.OwnerDrawFixed;//只有设置这个属性为OwnerDrawFixed才可能让重画起作用
lst.KeyUp+=new KeyEventHandler(lst_KeyUp);
lst.MouseUp
+=new MouseEventHandler(lst_MouseUp);
lst.KeyDown
+=new KeyEventHandler(lst_KeyDown);
}
#region Property
[Description(
"选定项的值"),Category("Data")]
public ListBox.SelectedObjectCollection SelectedItems
{
get
{
return lst.SelectedItems;
}
}

  关键的 就是对控件中常用的几个事件的重写

 #endregion

#region override
protected override void OnKeyUp(KeyEventArgs e) //按下某键时发生的
{
base.OnKeyDown(e);
bool Pressed=(e.Control && ((e.KeyData & Keys.A)==Keys.A));
if(Pressed)
{
for(int i=0;i<lst.Items.Count;i++)
lst.SetSelected(i,
true);
}
}
protected override void OnMouseDown(MouseEventArgs e)//按下鼠标
{
this.DroppedDown=false;

}
protected override void OnMouseUp(MouseEventArgs e)//放开鼠标
{
this.DroppedDown=false;
lst.Focus();
}

protected override void OnDropDown(EventArgs e)//打开选项列表,刷新下来菜单,这是关键
{
lst.Items.Clear();
lst.Show();
lst.ItemHeight
=this.ItemHeight;
lst.BorderStyle
=BorderStyle.FixedSingle;
lst.Size
=new Size(this.DropDownWidth,this.ItemHeight*(this.MaxDropDownItems-1)-(int)this.ItemHeight/2);
lst.Location
=new Point(this.Left,this.Top+this.ItemHeight+6);
lst.BeginUpdate();
for(int i=0;i<this.Items.Count;i++)
lst.Items.Add(
this.Items[i]);
lst.EndUpdate();

this.Parent.Controls.Add(lst);
}

#endregion
private void lst_KeyUp(object sender, KeyEventArgs e)
{
this.OnKeyUp(e);
}

private void lst_MouseUp(object sender, MouseEventArgs e)//鼠标在选择完条目之后,this.text会显示出被选中的项目
{
try
{
this.Text="";
for(int i=0;i<lst.SelectedItems.Count;i++)
{
if(i==0)
this.Text=lst.SelectedItems[i].ToString();
else
{
this.Text=this.Text+","+lst.SelectedItems[i].ToString();
}
}
}
catch
{
this.Text="";
}
bool isControlPressed=(Control.ModifierKeys==Keys.Control);
bool isShiftPressed=(Control.ModifierKeys==Keys.Shift);
if(isControlPressed || isShiftPressed)
lst.Show();
else
lst.Hide();
}

private void lst_KeyDown(object sender, KeyEventArgs e)//按下后this.text显示信息
{
switch(e.KeyData)
{
case Keys.Down:
if(lst.SelectedItems.Count!=0)
{
this.Text=lst.SelectedItem.ToString();
}
else
this.Text=this.Items[0].ToString();
break;
case Keys.Up:
if(lst.SelectedItems.Count!=0)
{
this.Text=lst.SelectedItem.ToString();
}
else
this.Text=this.Items[0].ToString();
break;
}
}
}
}

  

  

总结一下,其实combox的工作就是  在你选择了某个选项后,在它的显示框中
this.Text=lst.SelectedItems[i].ToString();

  因为它默认的selectedItems.count为1个。

所以在 lst.MouseUp+=new MouseEventHandler(lst_MouseUp);中才有:

 for(int i=0;i<lst.SelectedItems.Count;i++)
{
if(i==0) //常规的情况 单选
this.Text=lst.SelectedItems[i].ToString();
else
{
this.Text=this.Text+","+lst.SelectedItems[i].ToString(); //多选时,就将所有的都读出来就行了
}
}

  


posted @ 2011-08-30 09:07  Tammie-锴  阅读(4218)  评论(1编辑  收藏  举报