首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

FindControl无法获取动态生成的控件的解决方法

2013-07-16 
FindControl无法获取动态生成的控件的解决办法本帖最后由 xyytcs 于 2013-07-05 21:11:16 编辑请问各位大

FindControl无法获取动态生成的控件的解决办法
本帖最后由 xyytcs 于 2013-07-05 21:11:16 编辑 请问各位大侠有没有FindControl无法获取动态生成的控件的解决办法啊?
说明:
1. 数据库没问题,读取数据也没问题,就是要根据id获取动态生成的控件来进行相应操作。但是现在就是无法获取,一直都是空,id都是没问题的。
2. 已经百度了好久,查找了好些资料,只希望有碰到过此问题的大侠们帮忙,如有能帮忙解决问题者,分可以加倍,不是自己的经验粘贴别人的,就请不要打扰了。 控件
[解决办法]
1、FindControl方法针对后台数据绑定控件的,如果是动态生成的获取不了。
2、你可以看一看生成的客户端代码,在前台用Jquery取取看。
[解决办法]

引用:
请问各位大侠有没有FindControl无法获取动态生成的控件的解决办法啊?
说明:
1. 数据库没问题,读取数据也没问题,就是要根据id获取动态生成的控件来进行相应操作。但是现在就是无法获取,一直都是空,id都是没问题的。
2. 已经百度了好久,查找了好些资料,只希望有碰到过此问题的大侠们帮忙,如有能帮忙解决问题者,分可以加倍,不是自己的经验粘贴别人的,就请不要打扰了。


你是POST后找不到?Asp.net???
[解决办法]
动态生成的控件,每次postback需要重新创建和加入到页面中。
[解决办法]
动态生成的html标签,貌似无法通过脚本来获取以添加事件,然后操作,因为,DOM还未加载这些标签,注册事件也是于事无补

但是,有一点,你动态生成的标签,是完全可以调用前台所包含的JS方法的

基于这一点,那么,就可以在动态生成标签的时候,如下处理,添加事件,以方便操作

<a id='a1' onclick="Test(this);">测试</a>

而Test就是页面中所包含的JS方法,里面的this指向的也是该控件,都得到了,也就可以进行下一步操作
[解决办法]
每次重新创建使用同样的ID,asp.net运行时会自动载入ViewState
[解决办法]
如果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
[解决办法]
主要就掌握你控件生成的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);
        }
    }
}


[解决办法]
引用:
请问各位大侠有没有FindControl无法获取动态生成的控件的解决办法啊?
说明:
1. 数据库没问题,读取数据也没问题,就是要根据id获取动态生成的控件来进行相应操作。但是现在就是无法获取,一直都是空,id都是没问题的。
2. 已经百度了好久,查找了好些资料,只希望有碰到过此问题的大侠们帮忙,如有能帮忙解决问题者,分可以加倍,不是自己的经验粘贴别人的,就请不要打扰了。


你可以先做这样一个测试,来验证你是否真的懂得了asp.net所谓“动态生成控件”技术。

你可以把一个Button按钮拖到页面上,双击它产生注册一个处理方法(但是方法里可以先空着,什么都不做)。

好了,接下来,你就可以开始手工测试了。可以在你开发调试时任何时候,点击这个按钮,然后观察页面上的各种“动态控件”有没有丢失,或者即使没有丢失的话那么状态是否丢失了(例如动态设置的颜色变成默认值了)。你也可以设置监听机制看看此时是否多余地访问了数据库。

一个正常地asp.net应用程序,它在这个最简单的button“回发测试”下,不会丢失控件,也不会丢失控件的任何状态,也不会去浪费巨大的CPU时间去读取数据库。如果有任何一种bug,你应该先搞懂该如何进行asp.net编程,找个人去学学。

你想,如果你去csdn之类的地方问来的所谓解决方案,连这个简单的测试都通不过,那么你的程序越来越乱了。往往越是简单而根本性的测试,你反而越是应该注意。
[解决办法]
给初学者一个忠告。你应该仿照基本的入门教程,例如我经常拿5年多以前(那个时候作者甚至不懂asp.net ajax)的Scott Mitchell的教程来做例子。你可以看看教程上的那些丰富的入门例子,都是可以经得起这个简单的测试的!再看看往上其它许多博客,以及csdn的例子,你需要自己用这个基本的测试去动手评判。
[解决办法]
我随便搜索了几篇以前回复过的帖子,你或许可以参考:

http://bbs.csdn.net/topics/380169102
http://bbs.csdn.net/topics/380169102

不过了解原理,能够准确及时地发现自欺欺人的bug缠身,不一定就会正确地编程。正确地编程需要正规地学习控件开发技术。如果没有这个机会,那么我建议你使用那些入门教程上的基本方法,例如在DataList、ListView、ObjectDataSource控件等的辅助下的简单编程,不要一上来就搞高级的玩意儿。

热点排行