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(); //多选时,就将所有的都读出来就行了 } }
|
请发表评论