【问题标题】:Code behind isn't finding radio buttons after postback回发后代码后面找不到单选按钮
【发布时间】:2013-02-22 12:33:09
【问题描述】:

我有一个调查页面,我在表单加载事件中动态插入单选按钮。当我单击按钮发送结果时,回发后,单选按钮仍然存在,并且选中状态正确。但是,如果我在后面的代码中执行一些代码,试图检查其中一个是否被检查(通过 FindControl(id)),页面就会崩溃。我不能调试,所以我不知道错误是什么。


<%@ Control language="vb" AutoEventWireup="false" Explicit="True" Inherits="DotNetNuke.UI.Skins.Skin" %>
<%@ Register TagPrefix="dnn" TagName="USER" Src="~/Admin/Skins/User.ascx" %>
<style>
body {background-image:none; background-color:transparent;}
</style>
<div style="float:left; width:420px; height:335px;" id="divPerguntas" enableviewstate="true" runat="server"></div>
<div style="float:left; width:420px; height:75px;"><asp:ImageButton ImageUrl="/Portals/_default/Skins/AdWin/img/Enviar.png" id="imgEnviar" runat="server" style="cursor:pointer;" /></div>

<div id="ContentPane" runat="server"></div>

<script runat="server">
    Protected Sub EnviarClick() Handles imgEnviar.Click

        Dim conexao As SqlConnection
        Dim comando As SqlCommand
        Dim myReader As SqlDataReader
        Dim sql As String

        sql = "SELECT S.SurveyID, SO.SurveyOptionID FROM AdWin_Demo.dbo.Surveys S INNER JOIN AdWin_Demo.dbo.SurveyOptions SO ON S.SurveyID = SO.SurveyID WHERE S.VideoId = " + Request.QueryString("id") + " ORDER BY S.ViewOrder, SO.ViewOrder"
        conexao = New SqlConnection("#CONNECTIONSTRING#")
        conexao.Open()
        comando = New SqlCommand(sql, conexao)

        myReader = comando.ExecuteReader

        If myReader.HasRows Then
            Dim dt As New DataTable
            dt.Load(myReader)
            Dim SurveyID As Integer = 0
            Dim FirstQuestion As Boolean = True
            Dim checkedGroup As Boolean = False
            Dim insertList As New DataTable
            Dim ColumnIDSurveyOption As New DataColumn("c", GetType(Integer))
            insertList.Columns.Add(ColumnIDSurveyOption)
            Dim row As DataRow


            For Each dr As DataRow In dt.Rows
                If FirstQuestion Then
                    SurveyID = dr("SurveyID")
                    FirstQuestion = False
                End If
                If SurveyID <> dr("SurveyID") Then
                    SurveyID = dr("SurveyID")
                    checkedGroup = False
                End If
                If SurveyID = dr("SurveyID") And checkedGroup = False Then
                        Dim radiobuttonToCheck As RadioButton = FindControl(dr("SurveyOptionID").ToString())
                        If radiobuttonToCheck.Checked Then
                        checkedGroup = True
                        row = insertList.NewRow()
                        row("insertList") = dr("SurveyOptionID")
                        insertList.Rows.Add(row)
                        End If
                End If
            Next

            If checkedGroup = True Then
                Dim dnnUserCtrl As New DotNetNuke.Entities.Users.UserController
                For Each dr As DataRow In insertList.Rows
                    sql = "INSERT INTO AdWin_Demo.dbo.Adwin_RespostasDadas (IDUser, SurveyOptionID) SELECT " & dnnUserCtrl.GetCurrentUserInfo.UserID & ", " & dr("SurveyOptionID").ToString()
                    comando = New SqlCommand(sql, conexao)
                    myReader = comando.ExecuteReader
                Next
            Else
                Response.Write("Nao respondeste a tudo")
            End If
        End If

        myReader.Close()
        conexao.Close()


    End Sub
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        Me.EnableViewState = True

        'If Not Page.IsPostBack Then


        Dim conexao As SqlConnection
        Dim comando As SqlCommand
        Dim myReader As SqlDataReader
        Dim sql As String

        sql = "SELECT S.SurveyID, S.Question, SO.OptionName, SO.SurveyOptionID FROM AdWin_Demo.dbo.Surveys S INNER JOIN AdWin_Demo.dbo.SurveyOptions SO ON S.SurveyID = SO.SurveyID WHERE S.VideoId = " + Request.QueryString("id") + " ORDER BY S.ViewOrder, S.SurveyID, SO.ViewOrder"
        conexao = New SqlConnection("#CONNECTIONSTRING#")
        conexao.Open()
        comando = New SqlCommand(sql, conexao)

        myReader = comando.ExecuteReader


        If myReader.HasRows Then
            Dim dt As New DataTable
            dt.Load(myReader)
            Dim SurveyID As Integer = 0
            Dim FirstQuestion As Boolean = True
            Dim ActualDiv As System.Web.UI.HtmlControls.HtmlGenericControl

            For Each dr As DataRow In dt.Rows
                If SurveyID = dr("SurveyID") Then

                    Dim rb As New RadioButton
                    rb.GroupName = "Group" & SurveyID.ToString()
                    rb.ID = dr("SurveyOptionID").ToString()
                    rb.Text = dr("OptionName").ToString()
                    rb.EnableViewState = True
                    ActualDiv.Controls.Add(rb)
                    ActualDiv.Controls.Add(New LiteralControl("<br/>"))

                Else
                    SurveyID = dr("SurveyID")

                    If FirstQuestion = False Then
                        Dim hr2 As New HtmlGenericControl("hr")
                        divPerguntas.Controls.Add(hr2)
                    End If

                    Dim div As New System.Web.UI.HtmlControls.HtmlGenericControl("DIV")
                    div.Style.Add("float", "left")
                    div.Style.Add("width", "400px")
                    div.Style.Add("color", "#777")
                    div.Style.Add("font-size", "11px")
                    div.Style.Add("line-height", "15px")
                    divPerguntas.Controls.Add(div)
                    ActualDiv = div

                    ActualDiv.InnerText = dr("Question").ToString()
                    ActualDiv.Controls.Add(New LiteralControl("<br/>"))

                    Dim rb As New RadioButton
                    rb.GroupName = "Group" & SurveyID.ToString()
                    rb.ID = dr("SurveyOptionID").ToString()
                    rb.Text = dr("OptionName").ToString()
                    rb.EnableViewState = True
                    ActualDiv.Controls.Add(rb)
                    ActualDiv.Controls.Add(New LiteralControl("<br/>"))

                    FirstQuestion = False
                End If
            Next
            Dim hr As New HtmlGenericControl("hr")
            divPerguntas.Controls.Add(hr)
        End If

        myReader.Close()
        conexao.Close()

    End Sub
</script>

【问题讨论】:

  • “我不能调试”是什么意思?
  • 我忘了说,这是一个ascx文件,一个dotnetnuke皮肤。不知道怎么调试...
  • 如果您有另一种方法可以动态创建收音机,然后检查每组收音机是否都有选定的收音机,并将这些收音机的 ID 发送到后面的代码,以便我可以存储数据库中的信息,我会感谢你
  • Asp.Net 有&lt;asp:RadioButtonList /&gt; 或类似的东西。不知道对你有没有帮助。
  • 问题已解决,感谢帮助Dim radiobuttonToCheck As RadioButton = FindControl(dr("SurveyOptionID").ToString()) -> Dim radiobuttonToCheck As RadioButton = Me.FindControl(dr("SurveyOptionID").ToString())

标签: asp.net radio-button postback viewstate


【解决方案1】:

尝试在PreInit事件中向页面添加控件,看看是否可以正确访问数据。更多细节在这里http://msdn.microsoft.com/en-us/library/ms178472.aspx

【讨论】:

  • 我不明白。我忘了提,这是一个 ascx 文件,一个 dotnetnuke 皮肤。我应该如何做 PreInit 事件? Visual Studio 说当我将“加载”更改为“PreInit”时它不存在
  • 好吧UC没有preinit事件,你可以试试Init事件。
  • 使用 init 事件,回发后收音机消失
  • 如果您有另一种方法可以动态创建收音机,然后检查每组收音机是否都有选定的收音机,并将这些收音机的 ID 发送到后面的代码,以便我可以存储数据库中的信息,我会感谢你
  • 不跳过...很奇怪。你想看代码吗?我真的需要一些帮助...
【解决方案2】:
Dim radiobuttonToCheck As RadioButton = FindControl(dr("SurveyOptionID").ToString())

->

Dim radiobuttonToCheck As RadioButton = Me.FindControl(dr("SurveyOptionID").ToString())

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2014-09-13
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多