• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#combox的多选情况

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

  



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#ToString()方法一些特殊用法发布时间:2022-07-10
下一篇:
C#-使用ConfigurationManager保存数据到App.config发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap