2014-10-06 63 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