关于控件数组的疑问?

happywork8 2013-02-04 10:39:03
刚接触.net,假定我的form里已经存在30个checkbox,并且它们的位置已经对齐排好
我想通过循环未其text赋值,或者取其checked的值
dim che as new arraylist
che.add(checkbox1)
che.add(checkbox2)
.....
che.add(checkbox30)
对于这30个已经排好位置并存在于form中的checkbox,把其添加到数组列表中,是否要写30次??
有没有更好的办法?
...全文
96 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
happywork8 2013-02-05
  • 打赏
  • 举报
回复
非常好 感谢版版的指点,结贴了
  • 打赏
  • 举报
回复
Dim ary As CheckBox() = Controls.OfType(Of CheckBox)().ToArray()
threenewbee 2013-02-05
  • 打赏
  • 举报
回复
For i = 1 To 30 CType(Me.Controls("checkbox" & i), CheckBox).Checked = False Next

'============================='
' 围棋控件WeiQi.Control '
'作者:ChuYa.Studio::fanyugod '
' QQ:11330934 '
' Email::fanyugod@163.com '
' VB.NET '
'============================='
控件是19x19标准围棋控件,请在鼠标事件中加入相应代码
1 属性
1.1 只读属性
1.1.1 AuthorDeclare
   类型:String    
   说明:返回作者申明和版本信息
1.1.2 NextWhite
   类型:Boolean    
   说明:返回下一步棋信息(如果下步棋该白棋走为真)
1.1.3 WhiteTiNumber
   类型:integer   
   说明:返回白棋提到的黑棋数量
1.1.4 BlackTiNumber
   类型:integer    
   说明:返回黑棋提掉的白棋数量
1.1.5 GlobeErrMessage
   类型:String    
   说明:返回最后一个错误的解释   
1.1.6 Record_Finger
   类型:integer    
   说明:返回当前棋谱指针(也是当前棋谱显示长度)
1.1.7 Record_LastFinger
   类型:integer    
   说明:返回棋谱的最长纪录(如果没有回退,此数值将与Record_Finger相同)
1.1.8 Record_Long
   类型:integer    
   说明:返回棋谱的长度
   注意:只是棋谱数组的长度!不是已经下了的棋谱长度!其实这个属性没有什么用处,因为你无法手动增加它! 
1.1.9 Record_Hand(ByVal i As Integer)
   类型:byte    
   说明:返回第i步棋谱是黑棋还是白棋
   注意:其实除了让子棋,奇数就是黑棋,偶数就是白棋。参见后面的常数表
1.1.10 Record_X(ByVal i As Integer)
   类型:byte    
   说明:返回第i步棋所在的横坐标(应该是:1-19,写的时间有点长了>_1.1.11 Record_Y(ByVal i As Integer)
   类型:byte    
   说明:返回第i步棋所在的纵坐标(应该是:1-19,写的时间有点长了>_1.1.12 Record_Dead(ByVal i As Integer)
   类型:Boolean    
   说明:返回第i步是的死棋信息(如果此步棋提了对方的棋为真)
1.1.13 Record_Ti(ByVal i As Integer)
   类型:byte    
   说明:返回第i步是的提子信息(如果此步棋提了对方的棋,纪录是提了什么方向的棋。你不必管它的含义!)
   注意:如果你要保存棋谱,请纪录5个Record_(i as integer)属性!在读取棋谱时必须使用他们!
1.1.14 ReturnStatus
   类型:byte    
   说明:返回棋盘状态(参见常数表,分别为比赛状态,打谱状态和编辑状态)
   注意:状态将影响到单击鼠标左键会作出的反应
      比赛状态:如果是轮到matchwhite所指的白棋或黑棋时,左键才是走棋
      打谱状态:按照预先装入的棋谱反应,左键只是前进一步
      编辑状态:单击左键纪录一步棋,黑白棋轮流走!

1.2 可设置属性
1.2.1 QiPanBack
    类型:Byte    
    说明:棋盘背景样式
       0:使用纯色作为棋盘背景,纯色由BackGroudColor提供
       一下使用图片,请务必设置BackPictureImage属性
       1:居中
       2:平铺
       3:拉伸
       4:放大
       其他数值报错!
1.2.2 BackPictureImage
   类型:Bitmap    
   说明:背景图片,只有Qipanback为1,2,3,4数值时才有用
1.2.3 ShowNumber
   类型:Boolean    
   说明:是否显示每步棋的手数
1.2.4 ShowUpHand
   类型:boolean    
   说明:是否使用菱形框标示出上一步的位置,默认为True
1.2.5 BackGroudColor
   类型:Color   
   说明:棋盘的背景颜色,只有QiPanBack为0时才有用!  
1.2.6 PenDrawQiPan
   类型:pen    
   说明:画棋盘线的笔,可以设置宽度,颜色和线形……,只要是pen能设置的东西都行。
1.2.7 PenDrawOther
   类型:pen    
   说明:画各种显示线条,就是上一步提示,寻找手数,当前位置的画笔
1.2.8 StarBrush
   类型:SolidBrush    
   说明:画星位的笔刷
1.2.9 WordFont
   类型:font    
   说明:文字字体,包括手数和边框数值
1.2.10 MatchWhite
    类型:boolean    
    说明:点击左键走白棋还是黑棋,true为白棋,只有在比赛状态时才有用
1.2.11 WarningNumber
    类型:integer    
    说明:限制数量,如果回退超过这个数值,再走棋会提问!默认数值为5
1.2.12 WhiteIcon
    类型:icon    
    说明:显示的白棋图标,只能是图标
1.2.13 BlackIcon
    类型:icon    
    说明:显示的白棋图标,只能是图标        

2 接口
2.1 FindShouNumber(ByVal i As Integer)
   返回值:byte
   说明:寻找第i手棋,找到后会在棋盘上用方框显示出来直到点击了鼠标的左键,返回数值见常数表
2.2 TranslateErrCodeToExplain(ByVal code As Byte)
   返回值: String
说明:如名字所说……,返回一个错误代码的解释
2.3 UpDataBack
   返回值:无
说明:更新棋盘
2.4 BackOneStep
   返回值:boolean
说明:回退一步,真值成功,假值出现错误,通过GlobeErrMessage属性能得到错误信息,一般是回退到底的错误!
2.5 SetQiPanInit(ByRef QiPan(,) As Byte)
   返回值:boolean
说明:将QiPan(18,18)数组复制到棋盘中去,这个函数只能在棋谱没有纪录的时候使用,否则回出错,会设置GlobeErrMessage
注意:如果数组没有19,19个大会报错,超过的部分将忽略!其中数值只能是0,WHITE,BLACK。(参见参数表)
   用于让子棋,在棋开始前在棋盘上摆棋。
2.6 GoStep(ByVal x As Byte, ByVal y As Byte)
   返回值:boolean
说明:走一步棋接口,真是成功,假是出错(比如不能立即回填被提一子),会设置GlobeErrMessage
   如果是虚手请输入虚手常数
注意:x 为横坐标,y为纵坐标,只能是1-19数值,注意,此函数只能在棋盘状态为非打谱状态下才有用!
   如果用在比赛状态,本函数不检查走棋的顺序!
2.7 SetStauts(ByVal i As Byte, [ByRef Hand() As Byte] = Nothing, [ByRef ix() As Byte] = Nothing, [ByRef iy() As Byte] = Nothing, [ByRef dead()] As Boolean = Nothing, [ByRef ReTi()] As Byte = Nothing)
   返回值:boolean
说明:设置棋盘状态,真是成功,假是出错,会设置GlobeErrMessage
   i为状态常数(参见常数表,如果输入非常数表数值会出错!)
   其他参数只在i设置为DAPU时有用!后续5个数组的长度必须相等并大于0,否则出错!
   这5个参数是棋谱必要信息,与5个Record_(i as integer)属性相对应!如果你要保存棋谱,请务必注意!
注意:此函数会重置棋谱和棋盘!所有信息均将丢失,并且本函数不会发出任何提问!请一定要注意!!!!
   
3 相关常数
3.1 棋谱常数
   Const XUSHOU As Byte = 21 '虚手
Const BLACK As Byte = 111 '黑棋
Const WHITE As Byte = 100 '白棋
3.2 状态常数
   Const MATHING As Byte = 11 ' 比赛状态
Const DAPU As Byte = 22 ' 打谱状态
Const WRITEING As Byte = 33 '编辑状态

4 外部事件
  没有增加特殊的外部事件,当单击鼠标时,先进行棋盘操作,在引发OnMouseUp事件!主要的编程接口全在这个事件
  注意,当你处理鼠标事件时,整个棋谱已经完成更新和显示等一切工作或因为错误或限制没有对棋谱进行处理,
  你可以对比单击鼠标前的Record_Finger属性得到棋谱是否改变(也就是是否成果走棋的信息!)
  对比事件返回的按键属性和棋谱状态属性确定是那种事件发生(是走了一步棋,还是回退了一步,还是做了一步虚手,还是前进了一步……)
 
5 本说明到此结束,如有疑问可以联系我,联系方式见最上!
    
光盘使用说明 版权所有,侵权必究 软件环境 数据库:Microsoft Access 2000; 调试(开发)工具:Microsoft Visual Studio 6.0 服务器操作系统:开发过程中使用Windows XP Professional操作系统,系统运行服务器可以采用Windows 2000 Professional、Windows 2000 Server或其他高版本操作系统。 -----------------------------硬件环境--------------------------------------- CPU推荐使用Pentium II 400以上级别; 内存不低于128MB,推荐256MB; 其他为常规硬件配置,对显卡、声卡都无特别要求。 -----------------------------注意事项--------------------------------------- 本光盘主要为书中的源程序,关于如何使用这些源程序,一是看书中的说明,二是看本盘附带的视频演示。 -----------------------------光盘程序代码说明-------------------------------- 源文件\01 第1章 Visual Basic的集成开发环境; 源文件\02 第2章 Visual Basic 6.0基础; 源文件\03 第3章 程序控制结构; 源文件\04 第4章 过程的建立和使用; 源文件\05 第5章 数组; 源文件\06 第6章 高级数据类型; 源文件\07 第7章 基本控件; 源文件\08 第8章 高级控件; 源文件\09 第9章 面向对象程序设计; 源文件\10 第10章 多文档界面; 源文件\11 第11章 文件处理; 源文件\12 第12章 程序调试与错误处理; 源文件\13 第13章 数据库编程; 源文件\14 第14章 图形与图像处理; 源文件\15 第15章 多媒体应用; 源文件\16 第16章 网络编程; 源文件\17 第17章 Windows应用程序接口; 源文件\18 第18章 学生考试系统; 源文件\19 第19章 学生信息管理系统; 源文件\20 第20章 可视电话; -----------------------------售后服务--------------------------------------- 如果有什么疑问,可以通过作者的E-mail联系:yulei-king@163.com
在《爬虫/蜘蛛程序的制作(C#语言)》一文中,已经介绍了爬虫程序实现的基本方法,可以说,已经实现了爬虫的功能。只是它存在一个效率问题,下载速度可能很慢。这是两方面的原因造成的: 1. 分析和下载不能同步进行。在《爬虫/蜘蛛程序的制作(C#语言)》中已经介绍了爬虫程序的两个步骤:分析和下载。在单线程的程序中,两者是无法同时进行的。也就是说,分析时会造成网络空闲,分析的时间越长,下载的效率越低。反之也是一样,下载时无法同时进行分析,只有停下下载后才能进行下一步的分析。问题浮出水面,我想大家都会想到:把分析和下载用不同的线程进行,问题不就解决了吗? 2. 只是单线程下载。相信大家都有用过网际快车等下载资源的经历,它里面是可以设置线程数的(近年版本默认是10,曾经默认是5)。它会将文件分成与线程数相同的部分,然后每个线程下载自己的那一部分,这样下载效率就有可能提高。相信大家都有加多线程数,提升下载效率的经历。但细心的用户会发现,在带宽一定的情况下,并不是线程越多,速度越快,而是在某一点达到峰值。爬虫作为特殊的下载工具,不具备多线程的能力何以有效率可谈?爬虫在信息时代的目的,难道不是快速获取信息吗?所以,爬虫需要有多线程(可控数量)同时下载网页。 好了,认识、分析完问题,就是解决问题了: 多线程在C#中并不难实现。它有一个命名空间:System.Threading,提供了多线程的支持。 要开启一个新线程,需要以下的初始化: ThreadStart startDownload = new ThreadStart( DownLoad ); //线程起始设置:即每个线程都执行DownLoad(),注意:DownLoad()必须为不带有参数的方法 Thread downloadThread = new Thread( startDownload ); //实例化要开启的新类 downloadThread.Start();//开启线程 由于线程起始时启动的方法不能带有参数,这就为多线程共享资源添加了麻烦。不过我们可以用类级变量(当然也可以使用其它方法,笔者认为此方法最简单易用)来解决这个问题。知道开启多线程下载的方法后,大家可能会产生几个疑问: 1. 如何控制线程的数量? 2. 如何防止多线程下载同一网页? 3. 如何判断线程结束? 4. 如何控制线程结束? 下面就这几个问题提出解决方法: 1. 线程数量我们可以通过for循环来实现,就如同当年初学编程的打点程序一样。 比如已知用户指定了n(它是一个int型变量)个线程吧,可以用如下方法开启五个线程 Thread[] downloadThread;//声名下载线程,这是C#的优势,即数组初始化时,不需要指定其长度,可以在使用时才指定。这个声名应为类级,这样也就为其它方法控件它们提供了可能 ThreadStart startDownload = new ThreadStart( DownLoad );//线程起始设置:即每个线程都执行DownLoad() downloadThread = new Thread[ n ];//为线程申请资源,确定线程总数 for( int i = 0; i < n; i++ )//开启指定数量的线程数 { downloadThread[i] = new Thread( startDownload );//指定线程起始设置 downloadThread[i].Start();//逐个开启线程 } 好了,实现控制开启线程数是不是很简单啊? 2. 下面出现的一个问题:所有的线程都调用DonwLoad()方法,这样如何避免它们同时下载同一个网页呢? 这个问题也好解决,只要建立一下Url地址表,表中的每个地址只允许被一个线程申请即可。具体实现: 可以利用数据库,建立一个表,表中有四列,其中一列专门用于存储Url地址,另外两列分别存放地址对应的线程以及该地址被申请的次数,最后一列存放下载的内容。(当然,对应线程一列不是必要的)。当有线程申请后,将对应线程一列设定为当前线程编号,并将是否申请过一列设置为申请一次,这样,别的线程就无法申请该页。如果下载成功,则将内容存入内容列。如果不成功,内容列仍为空,作为是否再次下载的依据之一,如果反复不成功,则进程将于达到重试次数(对应该地址被申请的次数,用户可设)后,申请下一个Url地址。主要的代码如下(以VFP为例): CREATE TABLE (ctablename) ( curl M , ctext M , ldowned I , threadNum I ) &&建立一个表ctablename.dbf,含有地址、文本内容、已经尝试下载次数、线程标志(初值为-1,线程标志是从0开始的整数)四个字段 cfullname = (ctablename) + '.dbf'&&为表添加扩展名 USE (cfullname) GO TOP LOCATE FOR (EMPTY( ALLTRIM( ctext ) ) AND ldowned < 2 AND ( threadNum = thisNum OR threadNum = - 1) ) &&查找尚未下载成功且应下载的属于本线程权限的Url地址,thisNum是当前线程的编号,可以通过参数传递得到 gotUrl = curl recNum = RECNO() IF recNum <= RECCOUNT() THEN &&如果在列表中找到这样的Url地址 UPDATE (cfullname) SET ldowned = ( ldowned + 1 ) , threadNum = thisNum WHERE RECNO() = recNum &&更新表,将此记录更新为已申请,即下载次数加1,线程标志列设为本线程的编号。 cfulltablename = (ctablename) + '.dbf' USE (cfulltablename) SET EXACT ON LOCATE FOR curl = (csiteurl) &&csiteurl是参数,为下载到的内容所对应的Url地址 recNumNow = RECNO()&&得到含有此地址的记录号 UPDATE (cfulltablename) SET ctext = (ccontent) WHERE RECNO() = recNumNow &&插入对应地址的对应内容 ctablename = (ctablename) + '.dbf' USE (ctablename) GO TOP SET EXACT ON LOCATE FOR curl = (cnewurl) &&查找有无此地址 IF RECNO() > RECCOUNT() THEN &&如果尚无此地址 SET CARRY OFF INSERT INTO (ctablename) ( curl , ctext , ldowned , threadNum ) VALUES ( (cnewurl) , "" , 0 , -1 ) &&将主页地址添加到列表 好了,这样就解决了多线程中,线程冲突。当然,去重问题也可以在C#语言内解决,只根建立一个临时文件(文本就可以),保存所有的Url地址,差对它们设置相应的属性即可,但查找效率可能不及数据库快。 3. 线程结束是很难判断的,因为它总是在查找新的链接。用者认为可以假设:线程重复N次以后还是没有能申请到新的Url地址,那么可以认为它已经下载完了所有链接。主要代码如下: string url = ""; int times = 0; while ( url == "" )//如果没有找到符合条件的记录,则不断地寻找符合条件的记录 { url = getUrl.GetAUrl( …… );//调用GetAUrl方法,试图得到一个url值 if ( url == "" )//如果没有找到 { times ++;//尝试次数自增 continue; //进行下一次尝试 } if ( times > N ) //如果已经尝试够了次数,则退出进程 { downloadThread[i].Abort; //退出进程 } else//如果没有尝试够次数 { Times = 0; //尝试次数归零处理 } //进行下一步针对得到的Url的处理 } 4. 这个问题相对简单,因为在问题一中已经建议,将线程声名为类级数组,这样就很易于控制。只要用一个for循环即可结束。代码如下: for( int i = 0; i < n; i++ )//关闭指定数量n的线程数 { downloadThread[i].Abort();//逐个关闭线程 } 好了,一个蜘蛛程序就这样完成了,在C#面前,它的实现原来如此简单。 这里笔者还想提醒读者:笔者只是提供了一个思路及一个可以实现的解决方案,但它并不是最佳的,即使这个方案本身,也有好多可以改进的地方,留给读者思考。 最后说明一下我所使用的环境: winXP sp2 Pro VFP 9.0 Visual Studio 2003 .net中文企业版 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/peter1_jiang/archive/2007/10/23/1839137.aspx

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧