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 --------------------编程问答--------------------
前面加上一个判断
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 这样的话 就不需要任何判断了 --------------------编程问答--------------------
不行啊,加上后还是一样报错,报一样的错 --------------------编程问答--------------------
说了好多,你好像懂得很多啊(不才,没看懂),,,但你好像没有告诉我该怎么做,。。?能具体说一下该怎么做吗 --------------------编程问答-------------------- 呵呵,你迷茫是对的,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