当前位置:编程学习 > C#/ASP.NET >>

asp.net关于嵌套repeater的问题

前台代码部分是:
<asp:Repeater ID="Repeater2" runat="server" 
              onitemdatabound="Repeater2_ItemDataBound">
          <ItemTemplate>
          

      <div class="brand_li">
      <div class="brand_letter"><span><%# (Container.DataItem) %></span></div>
      <ul class="brand_name">
           <li><asp:Repeater ID="Repeater1" runat="server">
          <ItemTemplate>
         
          <a><%--<%#Eval("Name")%>--%> <%# (Container.DataItem) %></a>
          </ItemTemplate>
          </asp:Repeater></li>
      </ul>  
      </div>
      
      </ItemTemplate>
      </asp:Repeater>


后台绑定数据源部分:
private static DB db = new DB();
        string FL = "";
        DataTable d = db.GetDataTable("select Name from Brands order by Name");
        protected void Page_Load(object sender, EventArgs e)
        {
            //DB d = new DB();
            //DataTable table = d.GetDataTable("select Name from Brands where Name like 'A%' or Name like 'a%'");
            //RepeaterA.DataSource = table;
            //this.DataBind();

            string flag = "";
            string letter = "";
            FL += (d.Rows[0]["Name"].ToString()).Substring(0, 1);
            for (int i = 1; i < d.Rows.Count; i++)
            {
                flag = (d.Rows[i - 1]["Name"].ToString()).Substring(0, 1);
                letter = (d.Rows[i]["Name"].ToString()).Substring(0, 1);
                if (flag != letter && flag.ToUpper() != letter.ToUpper())
                {
                    FL += letter;
                }
            }
            this.Label1.Text = FL;
            char[] ch = FL.ToCharArray();
            this.Repeater2.DataSource = ch;
            this.DataBind();
            
        }

        protected void Repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            Repeater Repeater1 = e.Item.FindControl("Repeater1") as Repeater;
            string ch = e.Item.DataItem.ToString();
            DB d = new DB();
            DataTable table = d.GetDataTable("select Name from Brands where Name like '" + ch.ToUpper() + "%' or Name like '" + ch.ToLower() + "%'");
            Repeater1.DataSource = table;
            this.DataBind();
        }

在浏览器查看后出现这个错误:
堆栈空间不足,无法继续安全地执行程序。调用堆栈上的函数过多或堆栈上的函数使用过多的堆栈空间时,会发生这种情况。
异常详细信息: System.InsufficientExecutionStackException: 堆栈空间不足,无法继续安全地执行程序。调用堆栈上的函数过多或堆栈上的函数使用过多的堆栈空间时,会发生这种情况。

源错误:


行 58:         protected void Repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e)
行 59:         {
行 60:             Repeater Repeater1 = e.Item.FindControl("Repeater1") as Repeater;
行 61:             string ch = e.Item.DataItem.ToString();
行 62:             DB d = new DB();


大神告诉我该怎么解决吧???????????是不是太多了啊 ASP.NET Repeater 嵌套 String --------------------编程问答-------------------- 看到你的 Page_Load,就懒得看后边的问题了。这类没有 if(!IsPostback) 判断的程序,没有逻辑正确性和效率。例如你在页面上随便拖一个Button来测试,点击Button造成回发时不应该执行什么 this.DataBind() 语句,也不会去读取数据库,那才是基本正确的asp.net程序设计。如果你不太会asp.net编程,那么我建议仔细学习一下6、7年前的古老的 Scott mitchell 的asp.net 2.0教程(那个时候作者甚至还不知道asp.net ajax),仿照那个教程上的例子去开发,而不是你这类程序。你可能会发现,人家的asp.net 2.0技术的程序,很少手写代码。人家的在DataList里边嵌套Repeater的例子,不会弄两个 DataBind() 语句。

最为关键地是我说的那个Button测试。当点击这个Button回发时,根本不会去执行任何一个DataBind()语句,也不会去读取数据库,而界面上不会有任何改变(不会丢失控件状态,不会搞乱控件状态,也不会去用数据库中的新数据来突然地改变画面),经得起这个检验的程序这才是asp.net程序。 --------------------编程问答-------------------- 在asp.net的页面的程序设计机制中,在页面回发(而不是!IsPotback条件成立时)执行page_load时,asp.net需要重建上一次输出html页面时的画面上的整个控件树,这样asp.net才能够自动填入控件的状态数据,并且准备随后准确地触发各种事件。

而所谓DataBind()去重新绑定控件,是在 page_load 完毕之后的各种控件触发的事件中,例如在数据修改的“提交”按钮事件中,或者在整个页面的“刷新”按妞事件中。但是总之不是在page_load的时候去想当然地就破坏了控件树。如果对于回发页面你在page_load中就去执行databind(),那么asp.net就无法保证准确回填控件的旧的状态数据,也就无法保证准确触发各种事件(因为事件基本上都是相应客户端post的数据对旧有状态数据的changed的)。

关于你在红字中写的那些,其实还没有到这个程序需要去计较。就好像一个盲人摸象,他说“大象好像是一条蛇!可是怎么蛇头是个大窟窿呢?”,我们还没有到这个程度需要去计较,因为大象根本不像是一条蛇,这个盲人连大象应该是什么样子还没有搞定呢。 --------------------编程问答-------------------- Refer this :
http://www.cnblogs.com/insus/archive/2011/07/04/2097179.html --------------------编程问答--------------------
引用 楼主 guoluqiang 的回复:
前台代码部分是:
<asp:Repeater ID="Repeater2" runat="server" 
              onitemdatabound="Repeater2_ItemDataBound">
          <ItemTemplate>
          

      <div class="brand_li">
      <div class="brand_letter"><span><%# (Container.DataItem) %></span></div>
      <ul class="brand_name">
           <li><asp:Repeater ID="Repeater1" runat="server">
          <ItemTemplate>
         
          <a><%--<%#Eval("Name")%>--%> <%# (Container.DataItem) %></a>
          </ItemTemplate>
          </asp:Repeater></li>
      </ul>  
      </div>
      
      </ItemTemplate>
      </asp:Repeater>


后台绑定数据源部分:
private static DB db = new DB();
        string FL = "";
        DataTable d = db.GetDataTable("select Name from Brands order by Name");
        protected void Page_Load(object sender, EventArgs e)
        {
            //DB d = new DB();
            //DataTable table = d.GetDataTable("select Name from Brands where Name like 'A%' or Name like 'a%'");
            //RepeaterA.DataSource = table;
            //this.DataBind();

            string flag = "";
            string letter = "";
            FL += (d.Rows[0]["Name"].ToString()).Substring(0, 1);
            for (int i = 1; i < d.Rows.Count; i++)
            {
                flag = (d.Rows[i - 1]["Name"].ToString()).Substring(0, 1);
                letter = (d.Rows[i]["Name"].ToString()).Substring(0, 1);
                if (flag != letter && flag.ToUpper() != letter.ToUpper())
                {
                    FL += letter;
                }
            }
            this.Label1.Text = FL;
            char[] ch = FL.ToCharArray();
            this.Repeater2.DataSource = ch;
            this.DataBind();
            
        }

        protected void Repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            Repeater Repeater1 = e.Item.FindControl("Repeater1") as Repeater;
            string ch = e.Item.DataItem.ToString();
            DB d = new DB();
            DataTable table = d.GetDataTable("select Name from Brands where Name like '" + ch.ToUpper() + "%' or Name like '" + ch.ToLower() + "%'");
            Repeater1.DataSource = table;
            this.DataBind();
        }

在浏览器查看后出现这个错误:
堆栈空间不足,无法继续安全地执行程序。调用堆栈上的函数过多或堆栈上的函数使用过多的堆栈空间时,会发生这种情况。
异常详细信息: System.InsufficientExecutionStackException: 堆栈空间不足,无法继续安全地执行程序。调用堆栈上的函数过多或堆栈上的函数使用过多的堆栈空间时,会发生这种情况。

源错误:


行 58:         protected void Repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e)
行 59:         {
行 60:             Repeater Repeater1 = e.Item.FindControl("Repeater1") as Repeater;
行 61:             string ch = e.Item.DataItem.ToString();
行 62:             DB d = new DB();


大神告诉我该怎么解决吧???????????是不是太多了啊

前面加上一个判断
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)  --------------------编程问答-------------------- ItemDataBound事件里面加上 

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
}
e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem 
指触发的类型为DadaList中的基本行或内容行

详细解释请看这里http://blog.csdn.net/txqqnet/article/details/7941023 --------------------编程问答-------------------- repeter1.datascore=xxx;
repeter1.databind();
for int i=0 i<repeter1.items.count;i++
{
  repeter p=repeter1.items[i].find("repeter") as repeter;
  p.datascore=xxx;
  p.databind();
}

很少用ItemDataBound 这样的话 就不需要任何判断了 --------------------编程问答--------------------
引用 5 楼 kongwei521 的回复:
ItemDataBound事件里面加上 

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
}
e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem 
指触发的类型为DadaList中的基本行或内容行

详细解释请看这里http://blog.csdn.net/txqqnet/article/details/7941023

不行啊,加上后还是一样报错,报一样的错 --------------------编程问答--------------------
引用 2 楼 sp1234 的回复:
在asp.net的页面的程序设计机制中,在页面回发(而不是!IsPotback条件成立时)执行page_load时,asp.net需要重建上一次输出html页面时的画面上的整个控件树,这样asp.net才能够自动填入控件的状态数据,并且准备随后准确地触发各种事件。

而所谓DataBind()去重新绑定控件,是在 page_load 完毕之后的各种控件触发的事件中,例如在数据修改的“提交”按钮事件中,或者在整个页面的“刷新”按妞事件中。但是总之不是在page_load的时候去想当然地就破坏了控件树。如果对于回发页面你在page_load中就去执行databind(),那么asp.net就无法保证准确回填控件的旧的状态数据,也就无法保证准确触发各种事件(因为事件基本上都是相应客户端post的数据对旧有状态数据的changed的)。

关于你在红字中写的那些,其实还没有到这个程序需要去计较。就好像一个盲人摸象,他说“大象好像是一条蛇!可是怎么蛇头是个大窟窿呢?”,我们还没有到这个程度需要去计较,因为大象根本不像是一条蛇,这个盲人连大象应该是什么样子还没有搞定呢。

说了好多,你好像懂得很多啊(不才,没看懂),,,但你好像没有告诉我该怎么做,。。?能具体说一下该怎么做吗 --------------------编程问答-------------------- 呵呵,你迷茫是对的,SP老大只是给你建议,建议比直接给你代码要好得多了,这个道理你懂得

给你建议了,你难道不会自己查吗,MSDN GOOGLE 博客园 CSDN 总能找到的吧

尝试排错啊 加油

我是来看SP的评论的  --------------------编程问答-------------------- <%# (Container.DataItem) %> 
这句写的是神马,要么DataBinder.Eval(Container.DataItem,"属性或字段"),要么直接Eval("属性或字段"),你这么写根本没进行反射 --------------------编程问答-------------------- 楼上说的都是什么呀!
Repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e)这个事件是用来处理repeater控件对行数据绑定时的一些格式处理,这个事件是在每行数据被绑定时都会触发的,触发这个事件的前提条件是执行
Repeater1.DataSource = table;
            this.DataBind();

楼主你在这个事件里再对repeater控件进行数据绑定操作将进入死循环
解决方法:

protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
{
            DB d = new DB();
            DataTable table = d.GetDataTable("select Name from Brands where Name like 'A%' or Name like 'a%'");
            RepeaterA.DataSource = table;
            this.DataBind();
}
}
--------------------编程问答-------------------- 没看清题目不好意思,以上回答作废!
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,