2008-10-27 3 views
1

Раньше у меня был класс в 1.1 для Datagrid, унаследованный от класса DataGridColumn. Это позволило мне создать столбец флажка с окном un/check-all на стороне клиента в заголовке. Затем, когда я создал свою сетку, я бы просто добавил свой собственный столбец.Флажок GridView Колонка

В настоящее время я нахожусь в проекте, где мне нужна аналогичная функциональность для представления сетки, однако, похоже, не существует способа наследования или добавления функциональности в столбец.

Так что мой вопрос: есть ли способ переопределить столбец? или Этот код уже существует в многоразовом режиме?

Потребности просты: я хотел бы просто зарегистрировать JavaScript на странице и отобразить столбец флажков.

Я уже встречался с образцом 4guys, но они просто поместили весь код в код позади, я ищу что-то меньшее, чем копировать/вставлять.

ответ

0

Я унаследовал BoundField и придумал это:

Код страницы:

<%@ 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 с ItemTemplate, содержащим ваш CheckBox в вашем DataGrid Колонны?

Что-то вроде:

<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> 
Смежные вопросы