我正在编写一个显示数据库查询的应用程序。有不同的表格,我希望能够用单选按钮在它们之间进行选择。这当前工作正常,但现在我想弄清楚如何格式化数据中继器基于将显示哪个表(有不同数量的列,以不同的顺序,等等)我得到标题成功格式化因为它只是基本的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属性? (这不是我试图通过使用这种方法避免的吗?)
答案 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;
}
}
}