Колонка флажка GridView - PullRequest
       13

Колонка флажка GridView

1 голос
/ 27 октября 2008

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

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

Итак, мой вопрос: есть ли способ переопределить столбец? или этот код уже существует для повторного использования?

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

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

Ответы [ 3 ]

1 голос
/ 27 октября 2008

Я получил классы из System.Web.UI.WebControls.BoundField и .HyperLinkField Вас может заинтересовать наследование от класса CheckBoxField http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkboxfield.aspx

0 голосов
/ 28 октября 2008

Я унаследовал 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 голосов
/ 28 октября 2008

Не могли бы вы просто использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...