(Winform) DataGrid中自定义boolColumn列,在列标题位置实现全选.

接上篇随笔" 在Winform的DataGrid添加CheckBox列" http://snowlove67.cnblogs.com/archive/2005/11/23/282737.html

前几天一个朋友和我讨论,如何实现在行标题添加CheckBox列,实现全选功能,想了想这个应该是很常见的功能, 11.gif,不过没有作过,找不到合适的属性来设置,试着重写一个BoolColumn组件,但是没有成功,在设置Header上面的CheckBox位置的时候总是没有合适的途径来作。

实在没有办法了,只好偷了个懒,在DataGrid上面加入一个CheckBox,可以基本实现功能,不过外观不是很好看,可以根据需要再进行调整。而且在设置CheckBox位置的时候遇到了重写组件相同的问题,无法确定Header 的位置。只有在填充数据之后再实现这个添加列标题的功能,没有数据,HeaderText仍然显示初始的设定,而不是CheckBox。

基本的实现如下:(权作抛砖引玉,希望各位朋友看到了有好的方法多多指点,在此谢过...)

1.设置CheckBox作为BoolColumn列标题的代码.
 1 None.gif //  CheckBox which is defined as boolColumn header
 2 None.gif          private  CheckBox chkSelectAll  =   null ;
 3 ExpandedBlockStart.gifContractedBlock.gif         /**/ /// <summary>
 4InBlock.gif        /// Add a checkBox into dataGrid as dataColumn's header,for checking all rows.
 5ExpandedBlockEnd.gif        /// </summary>

 6 None.gif          private   void  AddHeaderForSelectAll()
 7 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {               
 8InBlock.gif            if (dtTemp == null || dtTemp.Rows.Count <= 0)
 9ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
10InBlock.gif                return ;
11ExpandedSubBlockEnd.gif            }

12InBlock.gif            // if checkBox object exists, return 
13InBlock.gif            if (chkSelectAll != null)
14ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
15InBlock.gif                return ;
16ExpandedSubBlockEnd.gif            }

17InBlock.gif            chkSelectAll = new CheckBox();
18InBlock.gif            chkSelectAll.Location = new Point(dataGrid1.GetCellBounds(00).X , dataGrid1.GetCellBounds(00).Y - dataGrid1.PreferredRowHeight);
19InBlock.gif            chkSelectAll.Size = new Size(dcSelected.Width - 4 , dataGrid1.PreferredRowHeight - 2);
20InBlock.gif            chkSelectAll.Text = "Select all";
21InBlock.gif            chkSelectAll.Visible = true;
22InBlock.gif            chkSelectAll.BackColor = SystemColors.Control;
23InBlock.gif            chkSelectAll.CheckedChanged += new EventHandler(chkSelectAll_CheckedChanged);
24InBlock.gif            this.dataGrid1.Controls.Add(chkSelectAll);            
25ExpandedBlockEnd.gif        }
***这里需要把dcSelected修改为全局变量,不然在AddHeaderForSelectAll方法里面是无法访问的.

2.为CheckBox列标题添加事件,以实现全选行..
 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
 2InBlock.gif        /// 
 3InBlock.gif        /// </summary>
 4InBlock.gif        /// <param name="sender"></param>
 5ExpandedBlockEnd.gif        /// <param name="e"></param>

 6 None.gif          private   void  chkSelectAll_CheckedChanged( object  sender, EventArgs e)
 7 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
 8InBlock.gif            if (chkSelectAll.Checked)
 9ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
10InBlock.gif                SelectAllRows(true);                
11ExpandedSubBlockEnd.gif            }

12InBlock.gif            else
13ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
14InBlock.gif                SelectAllRows(false);                
15ExpandedSubBlockEnd.gif            }

16ExpandedBlockEnd.gif        }

17 None.gif        
18 ExpandedBlockStart.gifContractedBlock.gif         /**/ /// <summary>
19InBlock.gif        /// Check all rows or not
20InBlock.gif        /// </summary>
21ExpandedBlockEnd.gif        /// <param name="bSelect"></param>

22 None.gif          private   void  SelectAllRows( bool  bSelect)
23 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
24InBlock.gif            if (this.dtTemp != null && this.dtTemp.Rows.Count > 0)
25ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
26InBlock.gif                foreach(DataRow dr in dtTemp.Rows)
27ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
28InBlock.gif                    dr["IsSelected"= bSelect;
29ExpandedSubBlockEnd.gif                }

30ExpandedSubBlockEnd.gif            }
        
31InBlock.gif            dtTemp.AcceptChanges();
32ExpandedBlockEnd.gif        }


调用的时候只要在填充数据之后执行此方法即可:
3.调用例子
1 None.gif     this .dataGrid1.DataSource  =  dtTemp.DefaultView;        
2 None.gif     AddHeaderForSelectAll();

这种实现很牵强,总感觉很不妥,希望各位看到的朋友,不吝笔墨留言指点赐教,多谢。

转载于:https://www.cnblogs.com/snowlove67/archive/2005/12/20/300910.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值