Колонка флажка GridView
-
04-07-2019 - |
Вопрос
Раньше у меня был класс 1.1 для Datagrid, унаследованный от класса DataGridColumn. Это позволило мне создать столбец флажка с блоком un / check-all на стороне клиента в заголовке. Затем, когда я разработал сетку, я бы просто добавил свой пользовательский столбец.
В настоящее время я работаю над проектом, в котором мне нужна аналогичная функциональность для вида сетки, однако, похоже, нет способа унаследовать или добавить функциональность в столбец.
Итак, мой вопрос: есть ли способ переопределить столбец? или этот код уже существует для повторного использования?
Потребности просты: я хотел бы просто зарегистрировать JavaScript на странице и отобразить столбец флажков.
Я уже сталкивался с примером 4guys, но они только что поместили весь код в код, я ищу что-то чуть менее копирующее / вставляющее.
Решение 3
Я унаследовал 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
Другие советы
Я получил классы из System.Web.UI.WebControls.BoundField и .HyperLinkField Возможно, вам будет интересно наследовать от класса CheckBoxField http : //msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkboxfield.aspx
Не могли бы вы просто использовать 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>