none
后台动态生成的table,怎么使用里面的值? RRS feed

  • 问题

  • 前台:

    <asp:Table ID="Table1" runat="server"/>
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

    后台:

    protected void Button1_Click(object sender, EventArgs e)
        {
            TableRow tr1 = new TableRow(); Table1.Rows.Add(tr1);
            TableCell tc1 = new TableCell(); tr1.Cells.Add(tc1);
            TableCell tc2 = new TableCell(); tr1.Cells.Add(tc2);
            TableCell tc3 = new TableCell(); tr1.Cells.Add(tc3);
            TextBox tb1 = new TextBox(); tc1.Controls.Add(tb1);
            TextBox tb2 = new TextBox(); tc2.Controls.Add(tb2);
            Button bt1 = new Button(); tc3.Controls.Add(bt1);
            bt1.Click += new System.EventHandler(this.bt1_Click);

        }
        protected void bt1_Click(object sender, EventArgs e)
        {
            Response.Write("<script>alert('"+tb1.Text+"!');</script>");       }

    我把我的代码简单化了,按Button1能生成Table1的行列,tb1,tb2,bt1都能看到。 问题是 触发bt1_Click里面 如何获取tb1,tb2的值?bt1_Click里面 Table1.Rows.count 为0啊,这里动态生成的不算了么。为什么GridView里面差不多的方法又能用呢?

    2013年6月8日 0:28

答案

  • 首先,你的tb1是局部变量,无法再bt1_Click事件中被访问到,会造成编译错误。

    其次:

     protected void bt1_Click(object senderEventArgs e)
            {
                Response.Write("<script>alert('" + (Table1.Rows[0].Cells[0].FindControl("MyBox"as TextBox).Text+ "!');</script>");
            }

    这段代码将永远无法得到执行。因为你的Button每次都会重新生成,每一次你点击button之后页面回传,都重新生成了一个新的Button。

    GridView中之所以可以“记忆”原有的Button等控件,是因为它应用了非常复杂的绑定机制以及大量的ViewState进行“记忆”(因为一个Html来回传输是无记忆的)。所以你的Row也是无记忆的(每次点击Button)都只会创建一个新的TableRow添加到Table控件中。

    另外,如果你在aspx代码中编写Table代码,页面来回提交不会被“忘记”是因为整个页面对代码序列化了(应用了DesignSerializationVisibility.Content),每次回发都序列化保存在上下文的流中,然后读取自然不会忘记。

    建议:用Repeater+DataTable后台绑定机制取代Table。

    或者用jQuery方式获取内容,存储到HiddenField控件中,后台设法获取。


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年6月8日 2:00
    版主
  • 这里你定义的tb1是一个局部变量,并且你每次发出请求的时候都会回传的,所以你每次的数据都会重新添加,之前的记录都不会保存到Table中的,你可以把Table1的内容存储在视图View对象中,这样每次回传都可以获取之前的Table内容的,因为控件tb1和tb2控件都是动态绑定的,你可以使用JQuery代码通过Name或ID的方式来获取,此时你可以使用IE 的F12按钮来查看响应后的html中对应的tb1和tb2对应的ID。

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年6月9日 11:10

全部回复

  • 通过动态生成的table结构,需要给每个tr,td设置名字,这样就能通过后台代码访问了。

    不过这个动作最好是在pageinit之前完成,否则访问还是有问题,只能通过js来访问了。


    family as water

    2013年6月8日 0:47
  • 首先,你的tb1是局部变量,无法再bt1_Click事件中被访问到,会造成编译错误。

    其次:

     protected void bt1_Click(object senderEventArgs e)
            {
                Response.Write("<script>alert('" + (Table1.Rows[0].Cells[0].FindControl("MyBox"as TextBox).Text+ "!');</script>");
            }

    这段代码将永远无法得到执行。因为你的Button每次都会重新生成,每一次你点击button之后页面回传,都重新生成了一个新的Button。

    GridView中之所以可以“记忆”原有的Button等控件,是因为它应用了非常复杂的绑定机制以及大量的ViewState进行“记忆”(因为一个Html来回传输是无记忆的)。所以你的Row也是无记忆的(每次点击Button)都只会创建一个新的TableRow添加到Table控件中。

    另外,如果你在aspx代码中编写Table代码,页面来回提交不会被“忘记”是因为整个页面对代码序列化了(应用了DesignSerializationVisibility.Content),每次回发都序列化保存在上下文的流中,然后读取自然不会忘记。

    建议:用Repeater+DataTable后台绑定机制取代Table。

    或者用jQuery方式获取内容,存储到HiddenField控件中,后台设法获取。


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年6月8日 2:00
    版主
  • 这里你定义的tb1是一个局部变量,并且你每次发出请求的时候都会回传的,所以你每次的数据都会重新添加,之前的记录都不会保存到Table中的,你可以把Table1的内容存储在视图View对象中,这样每次回传都可以获取之前的Table内容的,因为控件tb1和tb2控件都是动态绑定的,你可以使用JQuery代码通过Name或ID的方式来获取,此时你可以使用IE 的F12按钮来查看响应后的html中对应的tb1和tb2对应的ID。

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年6月9日 11:10