WinForm中类似WebForm中的CheckBoxList控件

web|控件

前些天,在.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,具体很多还有其它的功能没有加上,希望网友指正,添加更多功能

时间: 2024-09-17 04:34:36

WinForm中类似WebForm中的CheckBoxList控件的相关文章

急急急急急!我在UltraWebTab控件中动态的添加了checkboxlist控件......

问题描述 我在UltraWebTab控件中动态的添加了checkboxlist控件,现在我想获取这个checkboxlist控件的每一行的text值.如何获取啊?新人提问请各位大虾教教小弟.以下是部分代码:Infragistics.WebUI.UltraWebTab.Tabtab;tab=newInfragistics.WebUI.UltraWebTab.Tab(ds.Tables[0].Rows[i]["G_Name"].ToString());//tab.ContentPane.T

我在UltraWebTab控件中动态的添加了checkboxlist控件,现在我想获取这个checkboxlist控件的每一行的text值

问题描述 我在UltraWebTab控件中动态的添加了checkboxlist控件,现在我想获取这个checkboxlist控件的每一行的text值.如何获取啊?新人提问请各位大虾教教小弟.以下是部分代码:Infragistics.WebUI.UltraWebTab.Tabtab;tab=newInfragistics.WebUI.UltraWebTab.Tab(ds.Tables[0].Rows[i]["G_Name"].ToString());//tab.ContentPane.T

输入框-QT中如何实现多个输入控件(textedit或lineedit等)的连接

问题描述 QT中如何实现多个输入控件(textedit或lineedit等)的连接 需要达到这种效果,假设我有两个lineedit,每个最多只能输入5个字符,我在第一个控件里输入,输满5个后后面的继续输入则直接跳转到了第二个控件在第二个控件里继续,同理,如果我随机删除了第一个控件里的任意一个字符那么第二个控件里的字符也会跟着回退一格,即第二个控件里的第一个字符会回退到第一个控件里: 我最终需要的是连续很多个这样的控件组合,要求能持续输入时前一个控件满了自动跳转到下一个控件中,且前面控件里的字符删

winform-WinForm窗体中,清空诸如TEXTBOX 等控件中用户输入的内容

问题描述 WinForm窗体中,清空诸如TEXTBOX 等控件中用户输入的内容 WinForm窗体中,清空诸如TEXTBOX 等控件中用户输入的内容.记得有使用Controls和foreach 之类的.... 在下初学者,悉心求教.望各长辈指点迷津 解决方案 foreach (TextBox tb in Controls.OfType<TextBox>()) { tb.Text = ""; } 解决方案二: 不同的控件没有通用的方法,不过你可以有另一个思路,就是把窗体重新加

c#-C# 中这种文本框是什么控件?如图,点一下“...”就会弹出一个对话框

问题描述 C# 中这种文本框是什么控件?如图,点一下"..."就会弹出一个对话框 解决方案 是文件选择框吗??????? 解决方案二: FileUpload控件,工具箱里面可以找到 解决方案三: 如果你是使用winform 是没有这种控件的,如果需要的话得自定义控件,至于怎么自定义控件,你可以上网查查很简单

Form窗体通过回传的值,动态在panel中加载相应的用户控件

问题描述 Form窗体中左右各有一个panel(pannelLeft,panelRight),panelLeft中加载的用户控件中有个按钮事件,点击按钮后传值给From窗口,Form窗口通过回传的值,动态的在panelRight中加载相应的用户控件,怎么实现? 解决方案 解决方案二:winform?解决方案三:是winform的解决方案四:该回复于2012-04-16 15:55:16被版主删除解决方案五:左边导航.右边内容的方式左边导航,然后用字符串直接反射出控件解决方案六:现在的问题是For

在DevExpress程序中使用条形码二维码控件,以及进行报表打印处理

在很多业务系统里面,越来越多涉及到条形码.二维码的应用了,不管在Web界面还是WInform界面都需要处理很多物料相关的操作,甚至很多企业为了减少录入错误操作,为每个设备进行条形码.二维码的标签,直接在流程中进行扫描处理,仅仅在界面勾选一些处理选项即可,极大提高工作效率,降低出错的几率.本篇随笔介绍如何在基于WInform的DevExpress程序中对条形码.二维码的处理,包括界面展示,报表打印等常规的处理. 1.DevExpress的条形码操作及报表打印 在15.1以上的DevEpxress版

在ASP.NET中使用AJAX实时搜索功能控件--RealTimeSearchMonitor

Web Client Software Factory v2.0包含了一个RealTimeSearchMonitor控件 提供实时搜索功能 来帮助你在ASP.NET中使用ASP.NET AJAX 局部更新网页. 此文章帮助你 如何在ASP.NET 中使用 RealTimeSearchMonitor控件,数据来自Northwind数据库的Customers表,数据访问是用企业库写的,当然你也可以使用别的任何方式返回数据源,,不过不用企业库写个SQL语句还真是够复杂!!! 先决条件 使用realti

c#中如何在form的webbrowser控件中获得鼠标坐标

以下是对c#中如何在form的webbrowser控件中获得鼠标坐标的实现方法进行了详细的分析介绍,需要的朋友可以参考下   如图这样,其实是要插入一个time的控件,这样才能使得坐标值会根据鼠标的移动而不停变化.time插件中写 复制代码 代码如下: private void timer1_Tick(object sender, EventArgs e)         {             if (webBrowser1.Bounds.Contains(this.PointToClie