Multi-select ASP.NET datagrid(DataGrid多条记录选择的实现)

 Multi-select ASP.NET datagrid                                        
                                               By
Prashant Nayak (.Net Lover)  译 涟漪勇


      Multidatagrid.gif

简介
ASP.NET datagrid是非常强大和灵活的控件,但是一些特征它并没有提供,像多条记录的选择。 这篇文章显示的功能就是如何容易完成多条记录的选择。

代码的使用
在测试和使用一些有关grid 的javascript编码技巧之后,我得到的解决办法的如下内容。
  • 添加选择用的CheckBox在模板列(Template column)(Hotmail/Yahoo 风格)
  • 添加CheckBox的客户端事件 onclick() 和 javascript , 高亮显示和标记选择的行.
  • 添加服务器端事件 CheckedChanged() 来控制保留住高亮显示的内容. [因为在每次PostBack时DataGrid都会恢复最初的颜色,不会保留我们设置的高亮显示颜色]

None.gif < Columns >
None.gif 
< asp:TemplateColumn >
None.gif  
< HeaderTemplate >
None.gif   
< asp:CheckBox  id ="chkAll"  
None.gif      onclick
="javascript:SelectAllCheckboxes(this);"  runat ="server"  
None.gif    AutoPostBack
="false"  ToolTip ="Select/Deselect All"   />
None.gif  
</ HeaderTemplate >
None.gif  
< ItemTemplate >  
None.gif    
< asp:CheckBox  id ="chkSelect"  onclick ="javascript:HighlightRow(this);"
None.gif        runat
="server" OnCheckedChanged = "grdEmployees_CheckedChanged"  
None.gif        AutoPostBack
="false"   />
None.gif  
</ ItemTemplate >  
None.gif 
</ asp:TemplateColumn >  
None.gif
</ Columns >

SelectAllCheckBoxes()
这个方程使用了HotMail的选择风格,通过遍历窗体上的每一个CheckBox ,然后确定选择/不选择CheckBox.

HighlightRow()
为了实现在选择时高亮显示和在为选时不高亮显示.,我写了 HighlightRow() 函数, 当使用<asp:CheckBox>控件时,请注意一件非常重要的东西. 在CHECKBOX周围围绕<SPAN>标签,应此我们必须在javascript 中得到<SPAN>标签的.
    
None.gif // -------------------------------------------------------------
None.gif
     //  Select all the checkboxes (Hotmail style)
None.gif
     // -------------------------------------------------------------
None.gif
     function  SelectAllCheckboxes(spanChk){
None.gif    
None.gif    
//  Added as ASPX uses SPAN for checkbox 
None.gif
     var  oItem  =  spanChk.children;
None.gif    
var  theBox = oItem.item( 0 )
None.gif    xState
= theBox.checked;    
None.gif 
None.gif        elm
= theBox.form.elements;
None.gif        
for (i = 0 ;i < elm.length;i ++ )
None.gif        
if (elm[i].type == " checkbox "   &&  elm[i].id != theBox.id)
None.gif            {
None.gif            
// elm[i].click();
None.gif
             if (elm[i].checked != xState)
None.gif            elm[i].click();
None.gif            
// elm[i].checked=xState;
None.gif
            }
None.gif    }
None.gif 
None.gif    
// -------------------------------------------------------------
None.gif
     // ----Select highlish rows when the checkboxes are selected
None.gif
     //
None.gif
     //  Note: The colors are hardcoded, however you can use 
None.gif
     //        RegisterClientScript blocks methods to use Grid's
None.gif
     //        ItemTemplates and SelectTemplates colors.
None.gif
     //          for ex: grdEmployees.ItemStyle.BackColor OR
None.gif
     //                  grdEmployees.SelectedItemStyle.BackColor
None.gif
     // -------------------------------------------------------------
None.gif
     function  HighlightRow(chkB)    {
None.gif    
var  oItem  =  chkB.children;
None.gif    xState
= oItem.item( 0 ).checked;    
None.gif    
if (xState)
None.gif        {chkB.parentElement.parentElement.style.backgroundColor
= 'lightcoral';
None.gif           
//  grdEmployees.SelectedItemStyle.BackColor
None.gif
         chkB.parentElement.parentElement.style.color = 'white'; 
None.gif           
//  grdEmployees.SelectedItemStyle.ForeColor
None.gif
        } else  
None.gif        {chkB.parentElement.parentElement.style.backgroundColor
= 'white'; 
None.gif             
// grdEmployees.ItemStyle.BackColor
None.gif
         chkB.parentElement.parentElement.style.color = 'black'; 
None.gif             
// grdEmployees.ItemStyle.ForeColor
None.gif
        }
None.gif    }
None.gif    
//  -->
None.gif
 
这是客户端的事情,一直以来都很好用,既然这么好用,可能有人会问,为什么不用简单明了的HTML 中的checkbox控件呢?答案是ASP.NET 服务器端控件有viewstate属性,应此可以保留住选定的行当提交一个页面的时候.

服务器端
现在,在服务器端,我们要确保高亮的行没有丢失, 因为在每一次 postback, ASP.NET 回送到grid并且丢失高亮显示的行. 下面的方程重新得到高亮的行.
ExpandedBlockStart.gif ContractedBlock.gif Public   Sub grdEmployees_CheckedChanged() Sub grdEmployees_CheckedChanged(ByVal sender As Object, _
InBlock.gif    
ByVal e As System.EventArgs)
InBlock.gif  
Dim chkTemp As CheckBox = CType(sender, CheckBox)
InBlock.gif 
InBlock.gif  
Dim dgi As DataGridItem 
InBlock.gif 
InBlock.gif  dgi 
= CType(chkTemp.Parent.Parent, DataGridItem)
InBlock.gif  
If (chkTemp.Checked) Then 
InBlock.gif 
InBlock.gif    dgi.BackColor 
= grdEmployees.SelectedItemStyle.BackColor 
InBlock.gif    dgi.ForeColor 
= grdEmployees.SelectedItemStyle.ForeColor
InBlock.gif  
Else 
InBlock.gif 
InBlock.gif    dgi.BackColor 
= grdEmployees.ItemStyle.BackColor
InBlock.gif    dgi.ForeColor 
= grdEmployees.ItemStyle.ForeColor 
InBlock.gif  
End If
ExpandedBlockEnd.gif
End Sub

得到你选择的行
很简单! 遍历DataGridItems collection 取得 checkbox [例如. DemoGridItem.Cells(0).Controls(1)]. 检查 CHECKED 属性.当然你也可以用 DataKeyField 获得你要的东西.    

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值