2008-10-27 5 views
1

J'avais l'habitude d'avoir une classe dans 1.1 pour le Datagrid qui a hérité de la classe DataGridColumn. Cela m'a permis de créer une colonne de case à cocher avec une case un/check-all côté client dans l'en-tête. Puis, lorsque j'ai conçu ma grille, j'ajoutais simplement ma colonne personnalisée.Colonne GridView Checkbox

Je suis actuellement sur un projet où j'ai besoin de fonctionnalités similaires pour la vue de la grille, cependant, il ne semble pas y avoir un moyen d'hériter ou d'ajouter des fonctionnalités à une colonne.

Donc, ma question est, Y at-il un moyen de remplacer une colonne? ou Ce code existe-t-il déjà, de manière réutilisable?

Les besoins sont simples: je voudrais simplement enregistrer le JavaScript sur la page et afficher une colonne de cases à cocher.

Je suis déjà tombé sur l'exemple 4guys, mais ils ont juste mis tout le code dans le code derrière, je cherche quelque chose un peu moins de copier/coller.

Répondre

0

j'ai hérité du BoundField et est venu avec ceci:

Code Page:

<%@ 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> 

Et voici le contrôle:

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

Pouvez-vous utiliser un TemplateColumn avec un ItemTemplate contenant votre CheckBox dans votre DataGrid Colonnes?

Quelque chose comme:

<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> 
Questions connexes