0

我正在编写一个显示数据库查询的应用程序。有不同的表格,我希望能够使用单选按钮在它们之间进行选择。这目前工作正常,但现在我试图弄清楚如何根据将显示哪个表来格式化数据重复器(有不同数量的列,以不同的顺序等)我让标题成功格式化因为它只是基本的 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;
    }

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

4

2 回答 2

3

您应该有一个用于OnItemDataBound模板控件事件的事件处理程序,并在其中用于FindControl定位Literal控件并使用e.Item.DataItem.

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

于 2012-06-06T14:54:29.467 回答
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;
            }

        }

    }
于 2012-06-06T17:56:36.643 回答