下面是我的代码,想要获得自动生成的textbox中的数据,就必须先获得它的ID,然后通过ID得到其text中的内容.请各位高手指点!非常感谢!    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load'自动生成一个table,将各个数据存入table的单元格中.table本身绑定到PlaceHolder控件中
    Dim panduantb As New Table
        For i = 1 To UBound(panduanArray)
            Dim tbtr1 As New TableRow
            Dim tbtr2 As New TableRow
            Dim tbcell1 As New TableCell            tbcell1.Text = i.ToString
            tbtr1.Cells.Add(tbcell1)
            Dim tbcell2 As New TableCell
            tbcell2.Text = "问题"
            tbtr1.Cells.Add(tbcell2)
            Dim tbcell3 As New TableCell
            Dim radiobuttonpanduan1 As New RadioButtonList
            radiobuttonpanduan1.ID = "radiobuttonpanduan1" & i
            radiobuttonpanduan1.Items.Add("正确")
            radiobuttonpanduan1.Items.Add("错误")
            radiobuttonpanduan1.RepeatDirection = RepeatDirection.Horizontal
            tbcell3.Controls.Add(radiobuttonpanduan1)
            tbtr2.Cells.Add(tbcell3)
            panduantb.Rows.Add(tbtr1)
            panduantb.Rows.Add(tbtr2)
'下面这个语句是错误的,但我不知道怎么改进
'我的目的是取得生成的radiobutton的value值,可惜下面的语句取不到值
            panduananswerString &= radiobuttonpanduan1.SelectedItem.Text + "|"
        Next        PlaceHolder2.Controls.Add(panduantb)
    End Sub

解决方案 »

  1.   

    你可以在初始化控件的时候,绑定它的OnSelectChange事件。
    如:
    radiobuttonpanduan1.OnSelectChange += new System.EventHandler(this.radioChanged);然后:
    public void radioChanged(object sender, System.EventArgs e)
    {
         panduananswerString = ((RadioButtonList)sender).SelectedItem.Text;
    }
    在此我用的是C#.上面的方法,我没有测试过,希望对你有帮助。
      

  2.   

    程序应该没错
    创建动态RadioButtonList时,它本身什么都没选,所以
    radiobuttonpanduan1.SelectedItem.Text取不到值
      

  3.   

    radiobuttonpanduan1.Items.Add("正确")
    radiobuttonpanduan1.Items.Add("错误")
    在上面两句的后面加上: radiobuttonpanduan1.Items[0].Selected = True
      

  4.   

    但是我在界面运行的时候,填入了数据,我数据库中还是得不到值,Joy_Zhao(天生我才必有用......) 的方法我考虑一下看行不.
    还有哪位兄弟给出方法?
    我将尽快散分
      

  5.   

    是不是NullReferenceException如果是的话,就是程序一开始RadioButtonList根本就没选任何值,radiobuttonpanduan1.SelectedItem就是null,然后你再尝试读它的Text属性就肯定出错。
      

  6.   

    是ljf96345(纯狼) 说得对吗?
    现在我回家了,明天回公司试一试.晚上散分!
    谢谢啦
      

  7.   

    程序执行后是是没有radiobuttonpanduan1 这个控件的.
    Dim radiobuttonpanduan1 As New RadioButtonList
    这里仅仅是实例化了一个radiobutonlist对象.
    而你创建的radiobuttonlist对象的id却是
    radiobuttonpanduan1.ID = "radiobuttonpanduan1" & i所以窗体上是没有radiobuttonpanduan1这个控件的
      

  8.   

    truelove12说的是正确的.但能给出具体的改进算法吗?
    我这个菜鸟是没办法啦
      

  9.   

    找到一个类似的帖子,
    发出来大家共享,但我还是不知道该怎样改进我的算法啊
    ----------------------------------------------------------------------
    1.动态生成控件:
    不管是在asp.net里还是在windows application里,每一个控件都可以作为母控件,在其中添加一些子的控件,当然添加可以是手工添加进去,而动态添加控件一般如下:(asp.net中)
             dim textbox as textbox       '动态添加一个textbox控件
            textbox=new textbox()
             textbox.id="test"           '指定这个textbox的一些属性
            textbox.text="好玩"
            me.controls.add(textbox)        '在当前窗口上动态添加这个textbox
    在vs.net里头每个控件都有controls属性,此属性返回它所包含的子控件的集合,可以用add方法动态添加一个控件,clear方法清空所有控件等等
    2.动态获得控件的句柄值(也在asp.net中)
    如果要获得一个控件的子控件的句柄值,只需从它的controls集合里返回一个就可以,假设上例中窗口中只有我们动态生成的textbox一个控件
    则:dim textbox as textbox
    textbox=me.controls(0)  '获得句柄值,如有多个,则可用me.controls(1)、me.controls(2)等等
    response.write(textbox.id())       '它的属性值
    response.write(textbox.text())
    而如果要获得它的母控件(即包含它的控件)的句柄值
    只需这样:textbox.parent即为当前窗口的句柄值了
    也可以遍历一个控件下所有的子控件
    for i=0 to me.controls.count-1
      response.write(me.controls(i).id)
    next在windows application里像controls的各种属性也是能用的,而且用法于在asp.net中一致,只是在beta2版里弹不出来这个属性,不知为何,也许这是beta2编译器的一个小bug巴!
    总结:用动态的方法来获得和生成控件给程序带来很大的灵活性!其主要是用控件的controls集合的一些方法了!
      

  10.   

    我现在已经能获得控件的ID 了.但是由于是自动生成的控件,在page_load里生成了之后,控件的text属性就固定了.我在页面改变控件的选项,也不能获得该控件改变了的值.
    现在正在看这一篇文章
    http://djks.xuevb.net/Article/516333
    希望对各位有帮助
      

  11.   

    truelove12说的是错误的。你可以运行这个来看看:    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles Me.Load
            Dim panduantb As New Table
            For i As Integer = 1 To 5
                Dim tbtr1 As New TableRow
                Dim tbtr2 As New TableRow
                Dim tbcell1 As New TableCell            tbcell1.Text = i.ToString
                tbtr1.Cells.Add(tbcell1)
                Dim tbcell2 As New TableCell
                tbcell2.Text = "问题"
                tbtr1.Cells.Add(tbcell2)
                Dim tbcell3 As New TableCell
                Dim radiobuttonpanduan1 As New RadioButtonList
                radiobuttonpanduan1.ID = "radiobuttonpanduan1" & i
                radiobuttonpanduan1.Items.Add("正确")
                radiobuttonpanduan1.Items.Add("错误")
                radiobuttonpanduan1.RepeatDirection = RepeatDirection.Horizontal
                tbcell3.Controls.Add(radiobuttonpanduan1)
                tbtr2.Cells.Add(tbcell3)
                panduantb.Rows.Add(tbtr1)
                panduantb.Rows.Add(tbtr2)
                '这里说明 radiobuttonpanduan1 存在!
                AddHandler radiobuttonpanduan1.SelectedIndexChanged, _
                    AddressOf radiolist_SelectedIndexChanged
            Next
            Me.Form.Controls.Add(panduantb)
            Me.Form.Controls.Add(New Button())
        End Sub    Protected Sub radiolist_SelectedIndexChanged(ByVal sender As Object, _
            ByVal e As System.EventArgs)
            Me.Page.ClientScript.RegisterStartupScript(Me.GetType(), "result", _
                "<script>alert('" + DirectCast(sender, RadioButtonList).ID + _
                " 选择 ->" + DirectCast(sender, RadioButtonList).SelectedItem.Text + _
                "|" + "');</script>")
        End Sub
    很遗憾,asp.net2.0 对于动态添加的控件的处理机制与asp.net1.1不同,做了大大的简化。你的代码,我印象中在asp.net1.1中,如果将“PlaceHolder2.Controls.Add(panduantb)”那句提前到for循环之前执行,应该是可以取得客户端radionButtonlist选择的值的。不过既然已经是asp.net2.0时代了,我就不再去叙述asp.net1.1对于控件添加到页面控件树上是怎样进行复杂的操作了。关键只有一个,就是在asp.net1.1中当控件放到页面控件书之后“立刻”可以获得asp.net填入的post值,从而你访问SelectedIndex应该不会出错;而在asp.net2.0中则完全省去了这个步骤,而是在page_load之后才统一填入动态产生的控件的客户端post值,此时SelectedIndex就会得到“object未实例化”的错误,因为没有post值。asp.net2.0的机制简单多了,也更强调“事件编程”而强制你不能再用那种顺序编程的设计眼光。
      

  12.   

    此时SelectedIndex就会得到“object未实例化”的错误  -->
        你的代码在page_load结束之前,所以此时SelectedIndex就会得到“object未实例化”的错误
      

  13.   

    “想要获得自动生成的textbox中的数据,就必须先获得它的ID,然后通过ID得到其text中的内容”你这个说法也是错误的。想要获得自动生成的textbox中的数据,直接取它的text即可。或者还用上面这个例子:    Private r1 As RadioButtonList
        Private WithEvents r5 As RadioButtonList    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles Me.Load
            Dim panduantb As New Table
            Dim outStr As String = String.Empty
            For i As Integer = 1 To 5
                Dim tbtr1 As New TableRow
                Dim tbtr2 As New TableRow
                panduantb.Rows.Add(tbtr1)
                panduantb.Rows.Add(tbtr2)
                Dim tbcell1 As New TableCell
                tbcell1.Text = i.ToString
                tbtr1.Cells.Add(tbcell1)
                Dim tbcell2 As New TableCell
                tbcell2.Text = "问题"
                tbtr1.Cells.Add(tbcell2)
                Dim tbcell3 As New TableCell
                Dim radiobuttonpanduan1 As New RadioButtonList
                tbtr2.Cells.Add(tbcell3)
                radiobuttonpanduan1.ID = "radiobuttonpanduan1" & i
                radiobuttonpanduan1.Items.Add("正确")
                radiobuttonpanduan1.Items.Add("错误")
                radiobuttonpanduan1.RepeatDirection = RepeatDirection.Horizontal
                tbcell3.Controls.Add(radiobuttonpanduan1)
                If i = 1 Then
                    r1 = radiobuttonpanduan1
                ElseIf i = 5 Then
                    r5 = radiobuttonpanduan1
                End If
            Next
            Me.Form.Controls.Add(panduantb)
            Me.Form.Controls.Add(New Button())
        End Sub    Protected Sub r5_SelectedIndexChanged(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles r5.SelectedIndexChanged
            Me.Page.ClientScript.RegisterStartupScript(Me.GetType(), "result", _
                "<script>alert('" + r1.ID + " 选择 ->" + r1.SelectedItem.Text + _
                "\r\n" + r5.ID + " 选择 ->" + r5.SelectedItem.Text + _
                "|" + "');</script>")
        End Sub这里当改变第5个选择(r5)的时候,同时也显示第一个(r1)。注意,根本不用通过r1的id去寻找它!
      

  14.   

    你的代码与标题不符,我写了一个例子,你可以看到TextBox可以获得post的值,而且可以在页面回发的之后保持状态。这里计算t1、t2不是通过什么id去查找。Partial Class _Default
        Inherits System.Web.UI.Page
        Implements IPostBackEventHandler    Private t1, t2, t3 As TextBox    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles Me.Load
            Dim panduantb As New Table
            Dim tbtr1 As New TableRow
            Dim tbtr2 As New TableRow
            panduantb.Rows.Add(tbtr1)
            panduantb.Rows.Add(tbtr2)
            Dim tbcell As New TableCell
            tbtr1.Cells.Add(tbcell)
            t1 = New TextBox
            tbcell.Controls.Add(t1)
            tbcell = New TableCell
            tbcell.Text = "+"
            tbtr1.Cells.Add(tbcell)
            tbcell = New TableCell
            tbtr1.Cells.Add(tbcell)
            t2 = New TextBox
            tbcell.Controls.Add(t2)
            t2.Attributes("onkeypress") = "if(event.keyCode==13)" + _
                Me.Page.ClientScript.GetPostBackEventReference(Me, "")
            tbcell = New TableCell
            tbcell.Text = "="
            tbtr2.Cells.Add(tbcell)
            tbcell = New TableCell
            tbcell.ColumnSpan = 2
            tbtr2.Cells.Add(tbcell)
            t3 = New TextBox
            t3.ReadOnly = True
            tbcell.Controls.Add(t3)
            Me.Form.Controls.Add(panduantb)
        End Sub    Public Sub RaisePostBackEvent1(ByVal eventArgument As String) _
            Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
            Try
                t3.Text = Integer.Parse(t1.Text) + Integer.Parse(t2.Text)
            Catch
                t3.Text = "请在上面填入两个整数,然后按回车。"
            End Try
        End Sub
    End Class
    没有必要通过id去查找,就不要通过id。这不仅仅是为了性能(当页面上有几千一个控件的时候都通过id去查找完全是中浪费),更是为了编程的可靠性,所谓“言多必假”,当记错了要点的时候也就意味着会误用。当然按说所有动态产生的控件都应该尽量明确设置id,尽管没有任何作用也要这样。
      

  15.   

    如果像你的代码那样,产生的动态控件比较多,完全可以放到数组或者list等对象容器中,然后需要访问它们的控件直接拿出来对象,就像上面直接访问t3、t2、t1对象一样方便。不到万不得已不要使用FindControl这种代码。
      

  16.   

    sp1234(如果有懂得asp.net三分之一的人,工作就简单多了)  说得没错,怎么这么显而易见的东西我都看错了呢。ASP.NET在页面生命周期中会进行两次LoadPostData,如果你打开Trace就能看到Process Post Data和Process Post Data Second Try这两个执行步骤,其实就是那两次LoadPostData的执行,详细说明可以参考我的blog:
    http://cathsfz.sitesled.com/2006/04/loadpostdata.htm不过 sp1234(如果有懂得asp.net三分之一的人,工作就简单多了) 说ASP.NET 1.x时任何新添加的控件都会直接进行LoadPostData,我记得不是这样吧,ASP.NET 1.x里面也是仅仅有两次LoadPostData而且是集中执行的,和2.0一样分别在Page_Load的前后各执行一次。