2009-11-04 67 views
6

我在我的网页中有一个<asp:Repeater>,它绑定到编程创建的数据集。ASP.NET中继器和DataBinder.Eval

这个转发器的目的是从A-Z创建一个索引,当点击它时刷新页面上的信息。

的中继器具有像一个链接按钮,以便:

<asp:LinkButton ID="indexLetter" Text='<%#DataBinder.Eval(Container.DataItem,"letter")%>' 
runat="server" CssClass='<%#DataBinder.Eval(Container.DataItem, "cssclass")%>' 
Enabled='<%#DataBinder.Eval(Container.DataItem,"enabled")%>'></asp:LinkButton> 

数据集创建方式如下:

protected DataSet getIndex(String index) 
    { 
     DataSet ds = new DataSet(); 
     ds.Tables.Add("index"); 
     ds.Tables["index"].Columns.Add("letter"); 
     ds.Tables["index"].Columns.Add("cssclass");    
     ds.Tables["index"].Columns.Add("enabled"); 
     char alphaStart = Char.Parse("A"); 
     char alphaEnd = Char.Parse("Z"); 
     for (char i = alphaStart; i <= alphaEnd; i++) 
     { 
      String cssclass="", enabled="true"; 
      if (index == i.ToString()) 
      { 
       cssclass = "selected"; 
       enabled = "false"; 
      } 
      ds.Tables["index"].Rows.Add(new Object[3] {i.ToString(),cssclass,enabled }); 
     } 
     return ds; 
} 

然而,当我运行该页面中,“指定的转换无效异常“引发Text='<%#DataBinder.Eval(Container.DataItem,"letter")'。我不知道为什么,我已经尝试手动将字符串转换为(String),我尝试了一个ToString()方法,我试过了所有的东西。

此外,如果在调试器中为DataBinder.Eval(Container.DataItem,“letter”)添加一个监视,则它返回的值为“A”,根据我的说法,该文本属性应该没问题。

编辑:

这里是例外:

System.InvalidCastException了未处理由用户代码
消息= “指定的转换无效”。来源= “App_Web_cmu9mtyc”
堆栈跟踪: 在ASP.savecondition_aspx .__ DataBinding__control7(对象发件人,EventArgs e)在E:\的Documents and Settings \费尔南多\我 文档\ Visual Studio的 2008 \项目\ mediTrack \ mediTrack \ saveCondition。 ASPX:线45 在System.Web.UI.Control.OnDataBinding(EventArgs的) 在System.Web.UI.Control.DataBind(布尔raiseOnDataBinding) 在System.Web.UI.Control.DataBind() 在系统.Web.UI.Control.DataBindChildren()InnerException:

任何意见将不胜感激,谢谢编号2: 固定!问题不在Text或CSS标签中,但在Enabled标签中,我必须将其转换为布尔值。问题是,这个例外是在文本标签信号,我不知道为什么

+0

你一定的例外是“信”,而不是“启用”的一部分? – 2009-11-04 19:14:46

+0

你是对的zarembisty!就是这样,我从来没有尝试从启用的属性中移除Eval ......谢谢! – Fernando 2009-11-04 19:47:58

+0

我希望MS永远不会绑定到页面中。如果你只能通过代码隐藏来避免这些问题,那会更好。 – Phill 2011-07-25 00:18:55

回答

0

我不知道这是否会令任何区别,但尝试以下(注间距太)

<asp:LinkButton ID="indexLetter" Text='<%# Eval("letter")%>' 
runat="server" CssClass='<%# Eval("cssclass")%>' 
Enabled='<%# Eval("enabled")%>'></asp:LinkButton> 
+0

它也没有工作......我真的不知道发生了什么事! – Fernando 2009-11-04 19:12:21

1

从你给出的例子中,你不需要数据集,只需要数据表。你也没有指定列的数据类型。

DataTable indexTable = new DataTable(); 
indexTable.Columns.Add("letter", typeof(string)); 

//do stuff 

_repeater.DataSource = indexTable; 
_repeater.DataBind(); 

和评估这样的

Text='<%# Eval("letter")%>' 
+0

不幸的是,它仍然发生,如果我这样做(将数据类型添加到列,并只使用dataTable) 我编辑帖子以离开异常跟踪 – Fernando 2009-11-04 19:10:36

0

不破坏运动,但是这有什么错硬编码:

<a href="Page.aspx?LIndex=A">A</a> 
<a href="Page.aspx?LIndex=B">B</a> 
<a href="Page.aspx?LIndex=C">C</a> 
... 
<a href="Page.aspx?LIndex=Z">Z</a> 
+4

Noooo!那太糟了。一个简单的<%for(...){%> loop)会让这个过程简单得多。 – James 2012-01-08 11:52:13

0

它看起来像问题是与Enabled值 - 它需要是布尔值。

这工作:

 <asp:LinkButton ID="indexLetter" Text='<%# this.FooData()%>' 
     runat="server" CssClass='<%#DataBinder.Eval(Container.DataItem, "cssclass")%>' 
     Enabled='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem,"enabled"))%>'></asp:LinkButton>