【问题标题】:dynamically created radiobuttonlist "not declared"动态创建的单选按钮列表“未声明”
【发布时间】:2011-07-02 03:29:00
【问题描述】:

我正在动态创建一个表格,该表格在每一行中放置一个动态创建的单选按钮列表。

然后我想在单击提交按钮时在页面上显示结果。

我收到一条错误消息,指出

'question1' 未声明

为什么会发生这种情况?我已经在下面包含了我的所有代码。

后面的代码:

Sub Page_Load(ByVal Sender as Object, ByVal E as EventArgs)

    For i As Integer = 1 To 3
        Dim TableRow As New TableRow()
        Dim TableRowCell_1 As New TableCell()
        TableRowCell_1.Text = i
        Dim TableRowCell_2 As New TableCell()

        TableRow.Cells.Add(TableRowCell_1)
        TableRow.Cells.Add(TableRowCell_2)
        QuestionnaireTable.Rows.Add(TableRow)

        Dim question As New RadioButtonList
        question.ID = "question" & i
        question.RepeatColumns = "2"
        question.Items.Insert(0, new listitem("", "1"))
        question.Items.Insert(1, new listitem("", "2"))
        TableRowCell_3.Controls.Add(question)
    Next

End Sub

Sub btnSendFeedback_Click(sender as Object, e as EventArgs)
    Dim question1 As RadioButtonList = DirectCast(Page.FindControl("question1"), RadioButtonList)
    Dim question2 As RadioButtonList = DirectCast(Page.FindControl("question2"), RadioButtonList)
    Dim question3 As RadioButtonList = DirectCast(Page.FindControl("question3"), RadioButtonList)
    Response.write(question1.SelectedValue & " - " & question2.SelectedValue & " - " & question3.SelectedValue)
End Sub

正文:

<asp:Table runat="server" ID="QuestionnaireTable" />

<asp:Button OnClick="btnSendFeedback_Click" runat="server" Text="Submit..." ID="submitbutton" />    

【问题讨论】:

  • 我不完全确定,但是当您在 Page_Load 事件期间创建 RadioButtonList 时,它会在回发之间持续存在还是仅用于初始页面加载?您可能必须在 Page_Init 事件中创建它。尝试查看控件是否在回发之间持续存在,因为如果没有,则您无法在 Click 函数中引用它。
  • 您也必须删除“IsPostBack”!

标签: asp.net vb.net radiobuttonlist


【解决方案1】:

我可以看到你没有在任何地方声明它:)

由于“question1”是您的 ID,您必须使用 FindControl 找到它。

Page.FindControl(myId)

如果您只有 3 个项目,您可以在当前对象中定义它以便更好地使用。

private question1 as RadioButtonList
private question2 as RadioButtonList

Sub Page_Load(ByVal Sender as Object, ByVal E as EventArgs)
     me.question1 = new RadioButtonList
End Sub

Sub btnSendFeedback_Click(sender as Object, e as EventArgs)
        dim value = me.question1.selectedValue
End Sub

或者你可以做这样的事情

private rbls as new List(of RadioButtonList)

Sub Page_Load(ByVal Sender as Object, ByVal E as EventArgs)
     dim list1 as new RadioButtonList
     list.items.add...
     rbls.add(list)
End Sub

Sub btnSendFeedback_Click(sender as Object, e as EventArgs)
        For Each _item in Me.rbls
              Response.write(_item.SelectedValue)
        End For
End Sub

【讨论】:

  • 这允许页面加载,但不提交。我收到以下错误——System.NullReferenceException:对象引用未设置为对象的实例。有任何想法吗? - 那是在你添加所有额外信息之前,我现在来看看。
  • 我认为我的代码没问题。 NullReference 意味着您在某处忘记说“新”,或者您正在访问一个为空的子对象。但在“点击”发生之前,它总是执行“加载”。所以如果你点击“点击”,你所有的东西都已经在那里了。
  • 啊等一下,必须删除IsPostBack,否则回发时不会创建!
  • 好的...所以我已经根据我给你们的内容更新了我的代码...麻烦的是,实际上会有超过 3 个 RadioButtonLists 所以我想避免必须单独声明每一个。这可能吗?
  • 是的,这是我的第二种方法。我喜欢将它们放在列表中,因为您可以查询它们。如果你知道Linq?查询是一个很棒的功能。如果只想通过id查找,通过Page.FindControl(myId)获取控制就足够了。使用我的“列表”方法,您可以执行以下操作:dim selected = from i in me.rbls where i.selectedvalue = "test" select i
【解决方案2】:

当您在标记中声明控件时,Visual Studio 和 ASP.NET 会这样做,以便您可以在代码隐藏中访问该控件。

当您像这样动态声明控件时,必须从代码隐藏中访问。

有多种方法可以做到这一点,可能最简单的方法是:

Dim question1 As RadioButtonList = DirectCast(Page.FindControl("question1"), RadioButtonList)

【讨论】:

  • 抱歉,如果 DirectCast 不适合使用,我的 VB.NET 很弱。
猜你喜欢
  • 2011-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2013-02-03
相关资源
最近更新 更多