在ASP文本中编写ASP.NET代码

时间:2012-06-06 14:52:06

标签: c# asp.net .net

我正在编写一个显示数据库查询的应用程序。有不同的表格,我希望能够用单选按钮在它们之间进行选择。这当前工作正常,但现在我想弄清楚如何格式化数据中继器基于将显示哪个表(有不同数量的列,以不同的顺序,等等)我得到标题成功格式化因为它只是基本的HTML,但项目模板需要使用asp内联代码,我相信这会引起问题。

代码隐藏的相关代码:

protected string showDataTableItemTemplate()
{
    string itemTemplateText = string.Empty;

    if (tableSelection == "parts")
    {
        itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.PartNumber\") %></td>";
        itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.Description\") %></td>";

    }
    else if (tableSelection == "package")
    {
        itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.PackageNumber\") %></td>";
        itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.Description\") %></td>";

    }
    else if (tableSelection == "product")
    {
        itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.ProductNumber\") %></td>";
        itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.Description\") %></td>";
    }
    return itemTemplateText;
}

然后我只是在aspx中定义了这样的文字:

<asp:Literal runat="server" Text='<%#showDataTableItemTemplate() %>'></asp:Literal>

还有其他办法吗?

编辑:我现在有以下内容:

    protected void DataRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        LiteralControl itemTemplateLiteral = new LiteralControl();
        itemTemplateLiteral = (LiteralControl)FindControl("itemTemplate");
        string itemTemplateText = string.Empty;

        if (tableSelection == "parts")
        {
            itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.PartNumber\") %></td>";
            itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.Description\") %></td>";

        }
        else if (tableSelection == "package")
        {
            itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.PackageNumber\") %></td>";
            itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.Description\") %></td>";

        }
        else if (tableSelection == "product")
        {
            itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.ProductNumber\") %></td>";
            itemTemplateText += "<td><%# DataBinder.Eval(Container,\"DataItem.Description\") %></td>";

        }
        itemTemplateLiteral.Text = itemTemplateText;
    }

编译器一直告诉我, Object引用没有设置为对象的实例。错误。此外,我是否正确尝试设置Text属性? (这不是我试图通过使用这种方法避免的吗?)

2 个答案:

答案 0 :(得分:3)

您应该拥有模板控件的OnItemDataBound事件的事件处理程序,并在其中使用FindControl找到Literal控件并使用{{1}为其指定值}。

您当前的代码所做的只是将字符串分配给文字 - 这些不会作为页面标记的一部分进行评估,因为它们不是标记的一部分。

答案 1 :(得分:2)

绑定OnItemDataBound事件,找到页面中的控件并直接指定它们的值。像这样:

    protected void datalist1_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {

            // fetch values from the data bound row
            int identityID = e.Item.DataItem["columnname"];

            // Find your page control and assign values
            HtmlAnchor aBlogSbj = (HtmlAnchor)e.Item.FindControl("aBlogSbj");
            if (aBlogSbj != null)
            {
                aBlogSbj.HRef=identityID;
            }

        }

    }