本帖最后由 xyytcs 于 2013-07-05 21:11:16 编辑

解决方案 »

  1.   

    1、FindControl方法针对后台数据绑定控件的,如果是动态生成的获取不了。
    2、你可以看一看生成的客户端代码,在前台用Jquery取取看。
      

  2.   


    你是POST后找不到?Asp.net???
      

  3.   

    动态生成的控件,每次postback需要重新创建和加入到页面中。
      

  4.   

    动态生成的html标签,貌似无法通过脚本来获取以添加事件,然后操作,因为,DOM还未加载这些标签,注册事件也是于事无补但是,有一点,你动态生成的标签,是完全可以调用前台所包含的JS方法的基于这一点,那么,就可以在动态生成标签的时候,如下处理,添加事件,以方便操作<a id='a1' onclick="Test(this);">测试</a>而Test就是页面中所包含的JS方法,里面的this指向的也是该控件,都得到了,也就可以进行下一步操作
      

  5.   

    每次重新创建使用同样的ID,asp.net运行时会自动载入ViewState
      

  6.   

    如果lz是Postback的问题的话,可以看看这篇文章:Retaining State for Dynamically Created Controls in ASP.NET applications
    http://www.codeproject.com/Articles/3684/Retaining-State-for-Dynamically-Created-Controls-i
      

  7.   

    你好,我要实现的是这个功能,就是每种商品有n种颜色,每种颜色最多上传5张图片,就采用了下面文章中的方法,也就是FileUpload控件调用__doPostBack方法来用LinkButton的OnClick事件模拟一个事件触发的过程,在后台实现图片上传预览功能:
    http://blog.sina.com.cn/s/blog_5a7775e30101eczz.html
      

  8.   

    主要就掌握你控件生成的name的规律然后后台用request.form取值,我的测试代码如下<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
           <asp:Repeater ID="rpt1" runat="server">
               <ItemTemplate>
                <p>  我是一个动态生成的textbox奥!我的行id是<%#Eval("key") %></p>            </ItemTemplate>       </asp:Repeater>        <asp:Button ID="submitBtn" runat="server" Text="我是提交按钮奥" OnClick="submitBtn_Click" />
        </form>
    </body>
    </html>
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Dictionary<string, string> testdic = new Dictionary<string, string>();
                testdic.Add("1", "1");
                testdic.Add("2", "2");
                testdic.Add("3", "3");
                testdic.Add("4", "4");            rpt1.DataSource = testdic;
                rpt1.DataBind();            //下面动态创建textbox添加到repeater里面去
                for (int i = 0; i < rpt1.Items.Count; i++)
                {
                    TextBox txtBox = new TextBox();
                    txtBox.ID = "creatbox_" + i.ToString();
                    txtBox.Text = "creatbox_" + i.ToString();                rpt1.Items[i].Controls.Add(txtBox);
                }
            }
        }    protected void submitBtn_Click(object sender, EventArgs e)
        {
            //尝试读取动态控件的值
            for (int i = 0; i < rpt1.Items.Count; i++)
            {
                string curVal = Request.Form["rpt1$ctl" + i.ToString("00") + "$creatbox_" + i.ToString()] + "";
                TextBox txtBox = new TextBox();
                txtBox.ID = "creatbox_" + i.ToString();
                txtBox.Text = curVal;            rpt1.Items[i].Controls.Add(txtBox);
            }
        }
    }
      

  9.   


    你可以先做这样一个测试,来验证你是否真的懂得了asp.net所谓“动态生成控件”技术。你可以把一个Button按钮拖到页面上,双击它产生注册一个处理方法(但是方法里可以先空着,什么都不做)。好了,接下来,你就可以开始手工测试了。可以在你开发调试时任何时候,点击这个按钮,然后观察页面上的各种“动态控件”有没有丢失,或者即使没有丢失的话那么状态是否丢失了(例如动态设置的颜色变成默认值了)。你也可以设置监听机制看看此时是否多余地访问了数据库。一个正常地asp.net应用程序,它在这个最简单的button“回发测试”下,不会丢失控件,也不会丢失控件的任何状态,也不会去浪费巨大的CPU时间去读取数据库。如果有任何一种bug,你应该先搞懂该如何进行asp.net编程,找个人去学学。你想,如果你去csdn之类的地方问来的所谓解决方案,连这个简单的测试都通不过,那么你的程序越来越乱了。往往越是简单而根本性的测试,你反而越是应该注意。
      

  10.   

    给初学者一个忠告。你应该仿照基本的入门教程,例如我经常拿5年多以前(那个时候作者甚至不懂asp.net ajax)的Scott Mitchell的教程来做例子。你可以看看教程上的那些丰富的入门例子,都是可以经得起这个简单的测试的!再看看往上其它许多博客,以及csdn的例子,你需要自己用这个基本的测试去动手评判。
      

  11.   

    我随便搜索了几篇以前回复过的帖子,你或许可以参考:http://bbs.csdn.net/topics/380169102
    http://bbs.csdn.net/topics/380169102不过了解原理,能够准确及时地发现自欺欺人的bug缠身,不一定就会正确地编程。正确地编程需要正规地学习控件开发技术。如果没有这个机会,那么我建议你使用那些入门教程上的基本方法,例如在DataList、ListView、ObjectDataSource控件等的辅助下的简单编程,不要一上来就搞高级的玩意儿。
      

  12.   

    虽然最终没能解决问题,谢谢各位的热情回答,尤其要感谢findcaiyzh,sp1234两位详细的回答。
    我的问题应该就是解决不了的,动态生成的控件是没办法使用FindControl获取的。已经改寻其他实现方法。100分已根据各楼回答给与相应分数。祝大家工作顺利!
      

  13.   

    findcontrol使用的是控件的clientID
    控件动态生成的时候,我们一般都是给他赋了个ID。
    添加控件到前台后,自动又生成了一个clientID。
    看了下,好像没办法给ClientID赋值。
    8楼那种可以实现,但是应该是存在问题的,规则变了就不对了。
    不过可以手动添加个控件,然后后台取他的ClientID,再根据这个修改,就不怕规则变化了。
      

  14.   


    抱歉,头脑有点晕,上面写错了。。
    我现在的方式是:建立个静态变量数组,比如我的 List<DropDowmList>
    所有生成的都加入到数组中,然后在Page_Load中,循环把数组中的再加入到要加入的容器中,并且绑定事件。
    经测试通过了。