2017-08-24 61 views
0

我在Repeater中CheckBox的問題總是返回False值。我已經閱讀了許多關於此的問題,並且始終指向我將綁定數據與Not Page.IsPostBack,我已經完成了我發現的所有示例問題,但仍然沒有解決我的問題。CheckBox.Checked總是在中繼器中返回False

在這裏,我怎麼綁定的複選框:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Try 
     If Not Page.IsPostBack Then 
      Call Load_menu() 
     End If 
    Catch ex As Exception 
     Response.Write("Page_Load Exception :<br>" & ex.ToString) 
    End Try 
End Sub 

Private Sub Load_menu() 
    Try 
     sqlstring = "SELECT a.menuID, a.name, b.[status] " & _ 
        "FROM masterMenu a LEFT JOIN rolesDetail b ON b.menuID=a.menuID " & _ 
        "WHERE a.[status] = 1 and b.RoleID = '" & roleID & "' " & _ 
        "ORDER BY a.menuID " 
     DS = SQLExecuteQuery(sqlstring) 
     DT = DS.Tables(0) 
     rptMenu.DataSource = DT 
     rptMenu.DataBind() 
    Catch ex As Exception 
     Response.Write("Load_Menu Exception :<br>" & ex.ToString) 
    End Try 
End Sub 

Private Sub rptMenu_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptMenu.ItemDataBound 
    Try 
     If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
      Dim lblID As Label = e.Item.FindControl("LblID") 
      Dim lblName As Label = e.Item.FindControl("LblName") 
      Dim cblChild As CheckBox = e.Item.FindControl("cblChild") 
      Dim dr As DataRowView = e.Item.DataItem 

      lblID.Text = dr.Item("menuID").ToString 
      lblName.Text = dr.Item("name").ToString 

      If dr.Item("status").ToString = "1" Then 
       cblChild.ID = dr.Item("menuID").ToString 
       cblChild.Checked = True 
      Else 
       cblChild.ID = dr.Item("menuID").ToString 
       cblChild.Checked = False 
      End If 
     End If 
    Catch ex As Exception 
     Throw New Exception("<b>Error RptMenu Data bound :</b>" & ex.ToString) 
    End Try 
End Sub 

在這裏,我如何呈現中繼器:

<form id="form1" runat="server" class="form-horizontal"> 
       <div class="box-header"> 
       <h3 class="box-title"><asp:Label ID="lblHeader" runat="server"></asp:Label></h3> 
       </div> 
       <div class="box-body no-padding"> 
    <asp:Repeater ID="rptMenu" runat="server"> 
     <HeaderTemplate> 
        <table class="table table-striped"> 
         <tr> 
          <th style="width: 10px">#</th> 
          <th>ID</th> 
          <th>Nama</th> 
         </tr> 
     </HeaderTemplate> 
     <ItemTemplate> 
         <tr> 
          <td><asp:CheckBox ID="cblChild" runat="server"></asp:CheckBox></td> 
          <td><asp:Label ID="LblID" runat="server"></asp:Label></td> 
          <td><asp:Label ID="LblName" runat="server"></asp:Label></td> 
         </tr> 
     </ItemTemplate> 
     <FooterTemplate> 
        </table> 
     </FooterTemplate> 
    </asp:Repeater>  
        <div class="box-footer text-center"> 
         <dxe:aspxbutton id="btSimpan" runat="server" text="Simpan" cssclass="btn btn-primary" enabledefaultappearance="False"></dxe:aspxbutton> 
        </div> 
       </div>  
</form> 

而這裏Submit按鈕如何處理它:

Protected Sub btSimpan_Click(sender As Object, e As EventArgs) Handles btSimpan.Click 
    Try 
     sqlstring = "" 
     For i As Integer = 0 To rptMenu.Items.Count - 1 
      Dim item As RepeaterItem = rptMenu.Items(i) 
      Dim lblID As Label = item.FindControl("LblID") 
      Dim cblChild As CheckBox = item.FindControl("cblChild") 
      Dim status As String = "0" 

      If cblChild.Checked Then 
       status = "1" 
      End If 

      sqlstring = sqlstring & " UPDATE rolesDetail SET [status] = " & status & " " & _ 
         " WHERE roleID = '" & roleID & "' AND menuID = '" & lblID.Text.ToString.Replace("'", "''") & "'; " 
     Next 

     If SQLExecuteNonQuery(sqlstring) > 0 Then 
      Response.Redirect("roles.aspx") 
     End If 
    Catch ex As Exception 
     Response.Write("Error btSimpan_Click <BR> " & ex.ToString) 
    End Try 
End Sub 

我已使用SQL Server中的Profiler跟蹤它,並始終返回0值w這意味着cblChild.Checked總是返回False。

我不知道我在這裏錯過了什麼。任何幫助將不勝感激。

謝謝

回答

1

使用HtmlInputCheckBox控制,而不是CheckbBox

改變這一行

Dim cblChild As CheckBox = item.FindControl("cblChild") 

Dim cblChild As HtmlInputCheckBox = DirectCast(item.FindControl("cblChild"), HtmlInputCheckBox) 

這也需要使用HTML複選框控制與runat="server"嘗試:

<input type="checkbox" runat="server" id='cblChild'/> 

由於我們爲html複選框分配了ID。刪除在rptMenu_ItemDataBound事件中設置此ID,應刪除此行:

cblChild.ID = dr.Item("menuID").ToString