2008-10-27 187 views
1

我以前從DataGridColumn類繼承的Datagrid在1.1中有一個類。這使我可以創建一個複選框列,其中包含客戶端的un/check-all框。然後,當我設計我的網格時,我只需添加我的自定義列。GridView複選框列

我目前正在一個項目中,我需要網格視圖的類似功能,但是,似乎沒有辦法繼承或向列添加功能。

所以我的問題是,有沒有辦法重寫列?或者這個代碼是否已經以可重用的方式存在?

需求很簡單:我希望它只在頁面上註冊JavaScript並呈現一列複選框。

我已經遇到過4guys示例,但他們只是把所有的代碼放在後面的代碼中,我正在尋找一些沒有複製/粘貼的東西。

回答

0

我繼承了綁定列以及與此想出了:

頁代碼:

<%@ register tagprefix="CAC" namespace="UI.Controls" assembly="UI.Controls" %>  
<asp:gridview id="grdPrint" runat="server" autogeneratecolumns="False"> 
    <columns> 
     <cac:checkallcolumn /> 
     <asp:boundfield datafield="CompanyName" headertext="Company Name" /> 
    </columns> 
</asp:gridview> 

這是控制:

Imports system.Web.UI 
Imports system.Web.UI.WebControls 

Public Class CheckAllColumn 
    Inherits BoundField 

    Public Sub New() 
     MyBase.New() 
    End Sub 

    Public ReadOnly Property SelectedIndexes() As List(Of Int32) 
     Get 
      Dim selectedIndexList As New List(Of Int32) 
      Dim grdParent As GridView = CType(Me.Control, GridView) 
      For Each item As GridViewRow In grdParent.Rows 
       Dim chkBox As CheckBox = CType(item.FindControl("checkboxCol"), CheckBox) 
       If ((Not (chkBox) Is Nothing) _ 
          AndAlso chkBox.Checked) Then 
        selectedIndexList.Add(item.DataItemIndex) 
       End If 
      Next 
      Return selectedIndexList 
     End Get 
    End Property 

    Public ReadOnly Property SelectedDataKeys() As Object() 
     Get 
      Dim dataKeyList As ArrayList = New ArrayList 
      Dim grdParent As GridView = CType(Me.Control, GridView) 
      If (grdParent.DataKeys.Count > 0) Then 
       For Each selectedIndex As Int32 In SelectedIndexes 
        Dim DataKey As Object = grdParent.DataKeys(selectedIndex).ToString 
        dataKeyList.Add(DataKey) 
       Next 
      End If 
      Return CType(dataKeyList.ToArray(GetType(System.Object)), Object()) 
     End Get 
    End Property 

    Public Overrides Sub InitializeCell(ByVal cell As DataControlFieldCell, ByVal cellType As DataControlCellType, ByVal rowState As DataControlRowState, ByVal rowIndex As Integer) 
     If cell Is Nothing Then 
      Throw New ArgumentNullException("cell", "cell is null.") 
     End If 
     MyBase.InitializeCell(cell, cellType, rowState, rowIndex) 
     If (cellType = DataControlCellType.Header) OrElse (cellType = DataControlCellType.DataCell) Then 
      Dim checkbox As CheckBox = New CheckBox 
      If cellType = DataControlCellType.Header Then 
       checkbox.ID = "checkboxHead" 
      Else 
       checkbox.ID = "checkboxCol" 
      End If 
      cell.Controls.Add(checkbox) 
     End If 
    End Sub 

    Public Shared Sub RegisterClientCheckEvents(ByVal pg As Page, ByVal formID As String) 
     If pg Is Nothing Then 
      Throw New ArgumentNullException("pg", "pg is null.") 
     End If 
     If formID Is Nothing OrElse formID.Length = 0 Then 
      Throw New ArgumentException("formID is null or empty.", "formID") 
     End If 
     Dim strCol As String = GetCheckColScript() 
     Dim strHead As String = GetCheckHeadScript() 
     If Not pg.ClientScript.IsClientScriptBlockRegistered("clientScriptCheckAll") Then 
      pg.ClientScript.RegisterClientScriptBlock(pg.GetType, "clientScriptCheckAll", strHead.Replace("[frmID]", formID)) 
     End If 
     If Not pg.ClientScript.IsClientScriptBlockRegistered("clientScriptCheckChanged") Then 
      pg.ClientScript.RegisterClientScriptBlock(pg.GetType, "clientScriptCheckChanged", strCol.Replace("[frmID]", formID)) 
     End If 
     RegisterAttributes(pg) 
    End Sub 

    Private Shared Sub RegisterAttributes(ByVal ctrl As Control) 
     For Each wc As Control In ctrl.Controls 
      If wc.HasControls Then 
       RegisterAttributes(wc) 
      End If 
      If TypeOf (wc) Is CheckBox Then 
       Dim chk As CheckBox = DirectCast(wc, CheckBox) 
       If Not chk Is Nothing AndAlso chk.ID = "checkboxCol" Then 
        chk.Attributes.Add("onclick", "CheckChanged()") 
       ElseIf Not chk Is Nothing AndAlso chk.ID = "checkboxHead" Then 
        chk.Attributes.Add("onclick", "CheckAll(this)") 
       End If 
      End If 
     Next 
    End Sub 

    Private Shared Function GetCheckColScript() As String 
     Dim strScript As String 
     strScript = " <script language=JavaScript>" 
     strScript &= " function CheckAll(checkAllBox)" 
     strScript &= " {" 
     strScript &= " var frm = document.[frmID];" 
     strScript &= " var ChkState=checkAllBox.checked;" 
     strScript &= " for(i=0;i< frm.length;i++)" 
     strScript &= " {" 
     strScript &= "   e=frm.elements[i];" 
     strScript &= "  if(e.type=='checkbox' && e.name.indexOf('checkboxCol') != -1)" 
     strScript &= "   e.checked= ChkState ;" 
     strScript &= " }" 
     strScript &= " }" 
     strScript &= " </script>" 
     Return strScript 
    End Function 

    Private Shared Function GetCheckHeadScript() As String 
     Dim strScript As String 
     strScript = "<script language=JavaScript>" 
     strScript &= "function CheckChanged()" 
     strScript &= "{" 
     strScript &= " var frm = document.[frmID];" 
     strScript &= " var boolAllChecked;" 
     strScript &= " boolAllChecked=true;" 
     strScript &= " for(i=0;i< frm.length;i++)" 
     strScript &= " {" 
     strScript &= " e=frm.elements[i];" 
     strScript &= " if (e.type=='checkbox' && e.name.indexOf('checkboxCol') != -1)" 
     strScript &= "  if(e.checked== false)" 
     strScript &= "  {" 
     strScript &= "   boolAllChecked=false;" 
     strScript &= "   break;" 
     strScript &= "  }" 
     strScript &= " }" 
     strScript &= " for(i=0;i< frm.length;i++)" 
     strScript &= " {" 
     strScript &= " e=frm.elements[i];" 
     strScript &= " if (e.type=='checkbox' && e.name.indexOf('checkboxHead') != -1)" 
     strScript &= " {" 
     strScript &= "  if(boolAllChecked==false)" 
     strScript &= "   e.checked= false ;" 
     strScript &= "  else" 
     strScript &= "   e.checked= true;" 
     strScript &= "  break;" 
     strScript &= " }" 
     strScript &= " }" 
     strScript &= " }" 
     strScript &= " </script>" 
     Return strScript 
    End Function 
End Class 
0

你能不能用一個TemplateColumn中包含在你的DataGrid的複選框一個ItemTemplate列?

喜歡的東西:

<asp:DataGrid id="DG1" runat = "server" DataKeyField = "ID"> 
<Columns> 
<asp:TemplateColumn HeaderText="ProductName"> 
<ItemTemplate> 
<asp:CheckBox id="chkBox1" runat="server" 
Text =<%# DataBinder.Eval(Container.DataItem,"yourDataToBind") %> 
checked='<%# DataBinder.Eval(Container.DataItem,"yourBoolToBind") %>'> 
</asp:CheckBox> 
</ItemTemplate> 
</asp:TemplateColumn> 
</Columns> 
</asp:DataGrid>