2008-10-27 4 views
1

DataGridColumn 클래스에서 상속 된 DataGrid에 대해 1.1에서 클래스를 사용했습니다. 이를 통해 헤더의 클라이언트 쪽 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

당신이 당신의 데이터 그리드에 체크 박스를 포함하는 ItemTemplate을 가진에 TemplateColumn을 사용할 수 CheckBoxField를 클래스에서 상속에 관심이있을 수 System.Web.UI.WebControls.BoundField 및 .HyperLinkField 에서 파생 클래스 열?

뭔가 같은 :

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