none
关于动态增加控件问题 RRS feed

  • 问题

  • 我现在想做这样一个功能,在文件框中输入数量单击增加,在table里面动态的显示相对应数量的文本框,在单击执行按钮拿到这些动态生成的文本框对象

    在table里生成文本框类:
    public void table_building(System.Web.UI.WebControls.Table temp,int x)
            {
                temp.BorderWidth = 1;
                int numrows = x;
                int numcells = 2;
                for (int j = 0; j < numrows; j++)
                {
                    TableRow r = new TableRow();
                    for (int i = 0; i < numcells; i++)
                    {
                        TableCell c = new TableCell();
                        TextBox aa = new TextBox();
                        aa.ID = "test"+i.ToString()+j.ToString();

                        c.Controls.Add(aa);
                        r.Cells.Add(c);
                    }
                    temp.Rows.Add(r);
                }
            }

    ===========================================================
    页面文件
    protected void Button1_Click(object sender, EventArgs e)
            {
                Panel1.Visible = true;
                new ClassLibrary1.Class1().table_building(Table1, 3); 
                Response.Write("first"+Table1.Rows.Count.ToString());
           }


            protected void Button2_Click(object sender, EventArgs e)
            {
                Response.Write("first" + Table1.Rows.Count.ToString());
            }

    button1能拿到实际增加的到table里面的数量
    button2就拿不到实际数量了,但如果我把那个动态生成放到page_init()里面去这个数量就是固定的,没办法取到textbox里面输入的数量了,有什么办法可以解决嘛
    谢谢!


    2009年7月30日 2:42

答案

  • 楼主,你好

    动态添加的控件在postback后会自动消失的。
    之所以你的第一个能拿到是因为你在动态添加后没有回发就直接输出了,所以可以拿到。
    但是第二个和第一个是不同的。根据你给出的消息推测你是在另外一个button click中动态添加后,再点击另外一个button来response出table.rows的数量。
    因为在点击这个button的时候又发生了一次回发,所以那些动态添加的控件消失了所以你得不到。
    不知道你想要实现这种功能有什么目的,根据我的经验,这样的功能似乎没有什么作用。如果我理解不对,请详细说明。谢谢。
    Microsoft Online Community Support
    2009年7月31日 3:04
  • 关于动态添加控件后如何维持其状态的问题,请仔细阅读我的系列文章:
    http://www.cnblogs.com/cathsfz/category/76686.html
    Microsoft ASP.NET MVP
    2009年7月31日 7:42
    版主

全部回复

  • 在Page_Init里面可以使用 Request.Form["控件ID"]来获取控件的值。先试试这种方法能否取到你需要的值。



    理解的越多,需要记忆的就越少
    2009年7月30日 3:06
    版主
  • 我是在一个页面里面操作的
    第一个button是操作下面panel的显示及文本框数量的设置
    下面panel里面放着一个table和另一个button(这个button是做实际操作的)

    2009年7月30日 3:08
  • 楼主,你好

    动态添加的控件在postback后会自动消失的。
    之所以你的第一个能拿到是因为你在动态添加后没有回发就直接输出了,所以可以拿到。
    但是第二个和第一个是不同的。根据你给出的消息推测你是在另外一个button click中动态添加后,再点击另外一个button来response出table.rows的数量。
    因为在点击这个button的时候又发生了一次回发,所以那些动态添加的控件消失了所以你得不到。
    不知道你想要实现这种功能有什么目的,根据我的经验,这样的功能似乎没有什么作用。如果我理解不对,请详细说明。谢谢。
    Microsoft Online Community Support
    2009年7月31日 3:04
  • 嗯,是页面回发的问题,有了一个解决方案了,从viewstate里面在读取值,不过还不太完善,题库后台管理,动态答案的输入

    2009年7月31日 3:15
  • 您好,Web.UI.WebControls.Table是不支持序列化的,故用不到ViewState的好处,所以Postback时候就丢失了。
    您可以使用DataTable或DataSet来搭配使用。DataTable或DataSet都支持序列化。
    做法如下,请参考:
    1、将Web.UI.WebControls.Table的数据存入DataTable,再把DataTable存入一个ViewState像这样ViewState["vs_Table"] = dataTable;//dataTable是DataTable的一个实例。(当您需要多个表时可以使用DataSet。)

    2、存入ViewSate后就可以在PostBack中获取到ViewState["vs_Table"] ,再将其转类型 DataTable dataTable = ViewState["vs_Table"] as DataTable;再将dataTable写回Web.UI.WebControls.Table

    如果觉得麻烦可以配合GridView的DataSource来使用,或将生成和写出Web.UI.WebControls.Table数据的过程重构为两个方法。

    当然有很多资料不建议将DataTable或DataSet存入ViewState,这样会造成性能问题。但个人认为这个是性能和开发效率的博弈。如果客户的使用场景没问题的话。(我是指通过性能测试)用一些提高开发效率的方法也未尝不可。
    2009年7月31日 4:01
    版主
  • 谢谢!提供这样一个思路。
    2009年7月31日 6:57
  • 哈,不客气,互相交流,共同进步!

    2009年7月31日 7:38
    版主
  • 关于动态添加控件后如何维持其状态的问题,请仔细阅读我的系列文章:
    http://www.cnblogs.com/cathsfz/category/76686.html
    Microsoft ASP.NET MVP
    2009年7月31日 7:42
    版主