WinForm中类似WebForm中的CheckBoxList控件

原创 2004年03月30日 19:04:00

前些天,在.Net技术的论坛里面看到了有个帖子,我好像记得是怎么实现WinForm中类似WebForm中的CheckBoxList控件,我简单的实现了那样的一个控件

首先,你得建立一个控件项目,假如说是:

接着,你就添加一个类:CheckBoxCollection,它是个CheckBox的集合类

具体的代码如下

CheckBoxCollection.cs

using System;
using System.Collections;
using System.Windows.Forms;

namespace CheckListControl
{
 /// <summary>
 /// CheckBox的集合类
 /// </summary>
 public class CheckBoxCollection:System.Collections.CollectionBase
 {
  public CheckBoxCollection()
  {
   IList pIList=base.List;
  }

  public CheckBox this[int index]
  {
   get
   {
    return (CheckBox) List[index];
   }
  }
  public CheckBox Add(CheckBox obj)
  {
   base.List.Add(obj);
   return obj;
  }

  public void Remove(CheckBox obj)
  {
   base.List.Remove(obj);
  }
 }
}

然后,在CheckBoxList.cs文件中,定义全局变量

private CheckBoxCollection objCbc=new CheckBoxCollection();

 public event System.EventHandler CheckedChanged;

写自定义函数,外部接口

 

/// <summary>
  /// 新增一个CheckBox到控件
  /// </summary>
  /// <returns></returns>
  public CheckBox NewCheckBox()
  {
   lab.Visible=false;
   CheckBox cb=new CheckBox();
   cb.Name=GetName();
   cb.Text=cb.Name;
//   cb.Size=new Size(120,24);
   cb.Checked=false;
   cb.Visible=true;
   cb.CheckedChanged+=new EventHandler(CheckBox_CheckedChanged);//定义CheckedChanged事件,来捕捉它的事件
   int y=0;
   y=objCbc.Count * 24 + objCbc.Count * 8 + 12;//形成CheckBox的纵坐标
   cb.Location=new Point(12,y);
   objCbc.Add(cb);

   this.Controls.Add(cb);//添加CheckBox到控件

   int x=GetMaxWidth();//得到已经添加的CheckBox中的最大的宽度
   
   if(cb.Width >x )//如果现在添加的CheckBox的最大宽度大于已经添加的最大宽度,替换调x
   {
    x = cb.Width + 24;
   }

   this.Size=new Size(x ,y +12+24);//根据添加的CheckBox改变控件的大小

   return cb;
  }

  /// <summary>
  /// 自动形成新添加CheckBox的名称
  /// </summary>
  /// <returns></returns>
  private string GetName()
  {
   if(objCbc.Count>0)
   {
    ArrayList list=new ArrayList();
    for(int i=0;i<objCbc.Count;i++)
    {
     if(objCbc[i].Name.Trim().Length==9)
     {
      string str=objCbc[i].Name.Trim();
      if(str.Substring(0,8).ToLower()=="checkbox" && IsNumber(str.Substring(str.Length-1,1)))
      {
       list.Add(str.Substring(str.Length-1,1));
      }
     }
    }
    if(list.Count>0)
    {
     return "checkBox" + Convert.ToString(int.Parse(list[list.Count-1].ToString().Trim()) + 1);
    }
   }

   return "checkBox1";
  }

  /// <summary>
  /// 判断是否是阿拉伯数字
  /// </summary>
  /// <param name="strCompare"></param>
  /// <returns></returns>
  private bool IsNumber(string strCompare)
  {
   string strWord="0123456789";
   foreach(char chr in strWord)
   {
    if(strCompare==chr.ToString())
    {
     return true;
    }
   }
   return false;
  }

  /// <summary>
  /// 得到已经添加CheckBox中的最大宽度
  /// </summary>
  /// <returns></returns>
  private int GetMaxWidth()
  {
   int maxWidth=0;
   if(objCbc.Count>0)
   {
    for(int i=0;i<objCbc.Count;i++)
    {
     CheckBox cb=(CheckBox)objCbc[i];
     if(cb.Width>maxWidth)
     {
      maxWidth=cb.Width;
     }
    }
   }
   return maxWidth;
  }

//  [Browsable(true), Description("得到CheckBox集合"), Category("CheckList")]
//  public CheckBoxCollection CheckList
//  {
//   get
//   {
//    return objCbc;
//   }
//  }

   private void CheckBox_CheckedChanged(object sender, EventArgs e)
  {
   CheckedChanged(sender,new EventArgs());
  }

 

编译以后,就可以得到CheckListControl.dll;

添加新项目用于类的测试

在工具箱中->添加/移除项,把CheckListControl添加进来,然后拖CheckListControl到Form1中

form1.cs中

private void Form1_Load(object sender, System.EventArgs e)
  {
   CheckBox cb=checkBoxList1.NewCheckBox();
   cb.Name="chkFirst";
   cb.Text="第一个CheckBox";
   cb.Size=new Size(125,24);
   cb=checkBoxList1.NewCheckBox();
   cb.Name="chkSecond";
   cb.Text="第二个CheckBox";
   cb.Size=new Size(125,24);
  }

  private void checkBoxList1_CheckedChanged(object sender, System.EventArgs e)
  {
   CheckBox cb=(CheckBox)sender;
   MessageBox.Show("Name: " + cb.Name + "  Text: " +cb.Text);
  }

具体的就这样

其实,只是作了简单的一个CheckBoxList,具体很多还有其它的功能没有加上,希望网友指正,添加更多功能

ASP.NET WebForm 的CheckBoxList控件通过js获取Value值问题

ASP.NET WebForm 的CheckBoxList控件通过js获取Value值问题故事背景最近在改之前很早的一个项目,用的还是WebForm开发的。追加功能之后,有个地方是弹出层来填写表单信息...
  • lingxyd_0
  • lingxyd_0
  • 2015年12月06日 17:18
  • 3671

Winform和WebForm的异同

Winform和WebForm的一些比较,纯属个人观点.
  • sloder
  • sloder
  • 2011年01月16日 20:46
  • 5073

C# WinForm中CheckedListBox控件的数据绑定及DisplayMember与ValueMember获取问题

WinForm下的CheckListBox与asp.net下的CheckBoxList不一样,绑定与设置也没有那简单.web下只要设置DataSource,Value和Text即可,而且在获取文本的v...
  • renyouprince
  • renyouprince
  • 2009年04月29日 13:12
  • 12149

ASP.NET服务器控件CheckBoxList修改

背景:asp.net自带的服务器控件CheckBoxList,在生成Html时,未显示name值,这样在表单提交后,Request.Form(它是根据name值来获取的)无法获取选中的值,故对此控件小...
  • luoyeyu1989
  • luoyeyu1989
  • 2012年09月05日 22:39
  • 2998

CheckBoxList控件绑定数据和设置选定项

//获取属性 ProductPropertyDataSet propertyList = ProductProperty.SelectProductProper...
  • wangzl1163
  • wangzl1163
  • 2016年08月12日 11:48
  • 1256

[DevExpress]控件-checkboxlist之运用

数据绑定: string strSql = "SELECT [UserName],[Mail] FROM [OA].[dbo].[DZ_Users]"; ...
  • david_520042
  • david_520042
  • 2016年04月11日 10:39
  • 3030

.NET各大平台数据列表控件绑定原理及比较(WebForm、Winform、WPF)

说说WebForm: 数据列表控件:WebForm 下的列表绑定控件基本就是GridView、DataList、Repeater;当然还有其它DropDownList、ListBox等。  它们的...
  • cyq1162
  • cyq1162
  • 2016年11月23日 12:16
  • 509

WebForm 与 winform 路径获取

对于Windows程序 和Web 应用程序来说,他们运行的路径是不一样的,所以关键是判断当前运行的程序是哪种程序.于是我们可以使用如下的代码   string path ="";           ...
  • xiaogaolin
  • xiaogaolin
  • 2010年10月25日 14:18
  • 5108

C# WebForm <%%>用法

C# WebForm中用法 参考内容: http://www.cnblogs.com/nidakun/archive/2012/07/17/2595779.html 用于在前端执行后台代码, 或取...
  • hellozhangyanlin
  • hellozhangyanlin
  • 2017年12月21日 11:55
  • 64

限制CheckBoxList控件只能单选

限制CheckBoxList控件只能单选 开发要求,原本对CheckBoxList控件是用来让用户多选的。但现在特殊要求,这个CheckBoxList控件限制只能单选。 哈哈,看看...
  • kissdeath
  • kissdeath
  • 2014年07月09日 10:37
  • 5585
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WinForm中类似WebForm中的CheckBoxList控件
举报原因:
原因补充:

(最多只允许输入30个字)