2014-10-06 48 views
0

我有一個gridview控件在按鈕單擊事件後動態配置。一些列包含動態添加的複選框。出於某種原因,我無法獲取OnCheckedChanged事件來觸發此GridView中的任何複選框。CheckChanged事件沒有用動態複選框觸發?

這裏的按鈕單擊事件後所觸發:

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 

這是用於添加在GridView &複選框類:

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

你有在每次回發中最遲在'Page_load'中重新創建所有動態創建的控件。 – 2014-10-06 14:44:27

+0

我在Page_Load事件中放置了一個IfPostBack語句來動態構建控件,但OnCheckedChanged事件仍未被觸發。 – candyA 2014-10-06 15:26:31

回答

0

我相信我已經找到了答案,我自己題。經過一些更多的Google搜索之後,我添加了以下幾行代碼,CheckChanged事件終於開始了。這是朝着正確方向邁出的一步!

添加了這個在DynamicallyTemplatedGridViewHandler類中的AddHandler語句下:

field_chkbox.AutoPostBack = True 

至於建議由Tim S,我加入,裏面的動態GridView控件的頁面如下:

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