ASP.NET Repeater和DataBinder.Eval

时间:2009-11-04 18:36:13

标签: c# .net asp.net data-binding repeater

我的网页上有一个<asp:Repeater>,它绑定到一个以编程方式创建的数据集。

此转发器的目的是从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)手动转换为String,我尝试过ToString()方法,我已经尝试了所有内容。

另外,如果在调试器中我为DataBinder.Eval(Container.DataItem,“letter”)添加了一个监视,它返回的值是“A”,根据我的说法,它应该适用于Text属性。 / p>

编辑:

以下是例外:

  

System.InvalidCastException未被用户代码
处理   Message =“指定的演员表无效。”来源= “App_Web_cmu9mtyc”
  堆栈跟踪:          at ASP:sq.savecondition_aspx .__ DataBinding__control7(Object sender,EventArgs e)在e:\ Documents and Settings \ Fernando \ My中   Documents \ Visual Studio   2008 \ Projects \ mediTrack \ mediTrack \ saveCondition.aspx:第45行          在System.Web.UI.Control.OnDataBinding(EventArgs e)          在System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)          在System.Web.UI.Control.DataBind()          在System.Web.UI.Control.DataBindChildren()InnerException:

非常感谢任何建议,谢谢

编辑2:  固定!问题不在Text或CSS标记中,但在Enabled标记中,我不得不将其强制转换为布尔值。问题是异常是在Text标签上发出的,我不知道为什么

4 个答案:

答案 0 :(得分:1)

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

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

//do stuff

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

并像这样评估

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

答案 1 :(得分:0)

我不知道这是否会有所不同,但请尝试关注(注意间距)

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

答案 2 :(得分: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>

答案 3 :(得分:-1)

不要破坏练习,但硬编码有什么问题:

<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>