2014-10-06 1 views
0

나는 button-click 이벤트 후에 동적으로 구성된 gridview 컨트롤을 가지고있다. 일부 열은 동적으로 추가 된 확인란을 포함합니다. 어떤 이유로,이 Gridview의 모든 체크 상자에 대해 OnCheckedChanged 이벤트를 발생시킬 수 없습니다. 나는 내 자신에 대한 답을 발견했습니다 생각CheckChanged 이벤트가 동적 체크 박스로 실행되지 않습니까?

Imports System.Data 
Imports System.Configuration 
Imports System.Collections 
Imports System.Web 
Imports System.Web.Security 
Imports System.Web.UI 
Imports System.Web.UI.WebControls 
Imports System.Web.UI.WebControls.WebParts 
Imports System.Web.UI.HtmlControls 
Imports System.Collections.Specialized 
Imports System.Data.SqlClient 

Public Class DynamicallyTemplatedGridViewHandler 
    Implements ITemplate 

    Private ItemType As ListItemType 
    Private FieldName As String 
    Private InfoType As String 

    Public Sub New(item_type As ListItemType, field_name As String, info_type As String) 
     ItemType = item_type 
     FieldName = field_name 
     InfoType = info_type 
    End Sub 

    Public Sub InstantiateIn(Container As System.Web.UI.Control) Implements ITemplate.InstantiateIn 
     Select Case ItemType 
      Case ListItemType.Header 
       Dim header_ltrl As New Literal() 
       header_ltrl.Text = "<b>" & FieldName & "</b>" 
       Container.Controls.Add(header_ltrl) 
       Exit Select 
      Case ListItemType.Item 
       Select Case InfoType 
        Case "CheckBox" 
        ' for other 'non-command' i.e. the key and non key fields, bind textboxes with corresponding field values 
         Dim field_chkbox As New CheckBox() 
         field_chkbox.ID = FieldName 
         field_chkbox.Text = [String].Empty 
        ' if Inert is intended no need to bind it with text..keep them empty 
        AddHandler field_chkbox.DataBinding, New EventHandler(AddressOf OnDataBinding) 
        AddHandler field_chkbox.CheckedChanged, New EventHandler(AddressOf OnCheckedChanged) 
        field_chkbox.CausesValidation = False 

        Container.Controls.Add(field_chkbox) 
       Case Else 
        Dim field_lbl As New Label() 
        field_lbl.ID = FieldName 
        field_lbl.Text = [String].Empty 
        'we will bind it later through 'OnDataBinding' event 
        AddHandler field_lbl.DataBinding, New EventHandler(AddressOf OnDataBinding) 

        Container.Controls.Add(field_lbl) 
        Exit Select 

      End Select 
      Exit Select 
     Case ListItemType.EditItem 
      If InfoType = "CheckBox" Then 
       ' for other 'non-command' i.e. the key and non key fields, bind textboxes with corresponding field values 
       Dim field_chkbox As New CheckBox() 
       field_chkbox.ID = FieldName 
       field_chkbox.Text = [String].Empty 
       AddHandler field_chkbox.DataBinding, New EventHandler(AddressOf OnDataBinding) 
       AddHandler field_chkbox.CheckedChanged, New EventHandler(AddressOf OnCheckedChanged) 
       field_chkbox.CausesValidation = False 

       Container.Controls.Add(field_chkbox) 
      Else 
       ' for other 'non-command' i.e. the key and non key fields, bind textboxes with corresponding field values 
       Dim field_txtbox As New TextBox() 
       field_txtbox.ID = FieldName 
       field_txtbox.Text = [String].Empty 
       AddHandler field_txtbox.DataBinding, New EventHandler(AddressOf OnDataBinding) 

       Container.Controls.Add(field_txtbox) 
      End If 
      Exit Select 

    End Select 

End Sub 

Private Sub OnDataBinding(sender As Object, e As EventArgs) 

    Dim bound_value_obj As Object = Nothing 
    Dim ctrl As Control = DirectCast(sender, Control) 
    Dim data_item_container As IDataItemContainer = DirectCast(ctrl.NamingContainer, IDataItemContainer) 
    bound_value_obj = DataBinder.Eval(data_item_container.DataItem, FieldName) 

    Select Case ItemType 
     Case ListItemType.Item 
      Dim field_ltrl As CheckBox = DirectCast(sender, CheckBox) 
      field_ltrl.Checked = CBool(bound_value_obj.ToString()) 
      AddHandler field_ltrl.CheckedChanged, New EventHandler(AddressOf OnCheckedChanged) 
      field_ltrl.CausesValidation = False 

      Exit Select 
     Case ListItemType.EditItem 
      Dim field_txtbox As CheckBox = DirectCast(sender, CheckBox) 
      field_txtbox.Checked = CBool(bound_value_obj.ToString()) 
      AddHandler field_txtbox.CheckedChanged, New EventHandler(AddressOf OnCheckedChanged) 
      field_txtbox.CausesValidation = False 

      Exit Select 
    End Select 

End Sub 
+1

:

팀 S에 의해 제안
field_chkbox.AutoPostBack = True 

, 나는 동적 GridView 컨트롤을 수용하는 페이지에 다음을 추가 모든 포스트 백에서 늦게'Page_load'에 모든 동적으로 생성 된 컨트롤을 다시 생성합니다. –

+0

컨트롤을 동적으로 작성하기 위해 Page_Load 이벤트에 IfPostBack 문을 배치했지만 OnCheckedChanged 이벤트가 여전히 발생하지 않습니다. – candyA

답변

0

: 이것은이 (가)있는 gridview & 체크 박스를 추가하는 데 사용되는 클래스입니다

Private Sub BuildGridViewColumnList() 
    Try 
     ' Clear all columns. 
     grdCommodityConfig.Columns.Clear() 

     ' Add static columns. 
     Dim CommodityColumn As New BoundField 
     CommodityColumn.HeaderText = "Commodity" 
     CommodityColumn.DataField = "Commodity" 
     grdCommodityConfig.Columns.Add(CommodityColumn) 

     Dim PartTypeColumn As New BoundField 
     PartTypeColumn.HeaderText = "Part Type" 
     PartTypeColumn.DataField = "PartType" 
     grdCommodityConfig.Columns.Add(PartTypeColumn) 

     ' Add dynamic columns 
     Dim ColumnHeaders As String = String.Empty 
     Database.GetCommodityConfig(txtAssyLine.Text, ColumnHeaders) 
     Dim ColumnList As List(Of String) = ColumnHeaders.Split(New Char() {","c}).ToList 

     ' Add each column found in list returned from DB. 
     For Each ColumnName As String In ColumnList 
      Dim ItemTmpField As New TemplateField() 
      ' create HeaderTemplate 
      ItemTmpField.HeaderTemplate = New DynamicallyTemplatedGridViewHandler(ListItemType.Header, ColumnName, "CheckBox") 
      ' create ItemTemplate 
      ItemTmpField.ItemTemplate = New DynamicallyTemplatedGridViewHandler(ListItemType.Item, ColumnName, "CheckBox") 
      'create EditItemTemplate 
      ItemTmpField.EditItemTemplate = New DynamicallyTemplatedGridViewHandler(ListItemType.EditItem, ColumnName, "CheckBox") 
      ' then add to the GridView 
      ItemTmpField.ItemStyle.HorizontalAlign = HorizontalAlign.Center 
      grdCommodityConfig.Columns.Add(ItemTmpField) 
     Next 

    Catch ex As Exception 
     Throw ex 
    End Try 
End Sub 

:

다음은 버튼 클릭 이벤트 후 화재 무엇 문제. 더 많은 Google 검색을 한 후 다음 코드 줄을 추가하고 CheckChanged 이벤트가 마침내 시작되었습니다. 올바른 방향으로 나아가는 단계입니다!

추가 된이는 DynamicallyTemplatedGridViewHandler 클래스의 AddHandler에 문 아래 : 당신은이

Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 

    If Me.IsPostBack Then 
     Try 
      ' Need to build the column list dynamically. 
      BuildGridViewColumnList() 

      ' Refresh GridView data. 
      BindGridViewData() 

      SetErrorMessage(String.Empty) 
     Catch ex As Exception 
      SetErrorMessage(ex.Message) 
     End Try 
    End If 

End Sub 
관련 문제