我使用Repeater
从不同的表中读取,因为表有不同的列,我将不得不使用动态模板。
<asp:Repeater ID="tableData" runat="server" DataSourceID="SqlDataSource2">
<ItemTemplate>
<asp:PlaceHolder ID="tableBody" runat="server">
</asp:PlaceHolder>
</ItemTemplate>
</asp:Repeater>
但是VS 2010似乎没有认识到嵌套在转发器中的占位符。
所以我试图让占位符生成转发器,但是如何手动更改内部代码?没有“innerHtml”选项。
更新
我注意到如果占位符是合适的,但我想要的是动态生成<ItemTemplate>
内的内容,例如<%# DataBinder.Eval(Container.DataItem, "username") %>
因为我正在从不同的表中读取不同的表列,所以需要根据用户想要的表来选择。
所以我需要在处理之前修改ASPX代码,有没有更好的方法呢?
答案 0 :(得分:1)
Visual Studio不会选择嵌套在Repeater中的控件。为此,您需要使用FindControl访问Repeater中的控件。
以下是两个可用于访问Repeater中控件的示例。
1)通过Repeater项目循环
foreach (RepeaterItem item in tableData.Items)
{
if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
{
var ph = (PlaceHolder)item.FindControl("tableBody");
//Do something with your placeholder
ph.Visible = true;
}
}
2)在Repeater上使用ItemDataBound
事件
void tableData_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var ph = (PlaceHolder) e.Item.FindControl("tableBody");
//Do something with your placeholder
ph.Visible = true;
}
}
如果您打算使用ItemDataBound
事件,则需要将以下属性添加到Repeater:
OnItemDataBound="tableData_ItemDataBound"
您能澄清一下您对占位符的确切要求吗?占位符没有“innerHTML”属性。我认为你误解了JavaScript。我认为你想用一些Html填充你的转发器内的控件。你可以改用文字。
使用Literal根据数据库中的数据动态填充Repeater。
void tableData_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
//Get column from datasource
DataRowView drv = (DataRowView)e.Item.DataItem;
var lit = (Literal) e.Item.FindControl("MyLiteral");
//Populate Literal with data
StringBuilder htmlMarkup = new StringBuilder();
htmlMarkup.AppendFormat("{0}<br />", drv["username"].ToString());
htmlMarkup.AppendFormat("{0}<br />", drv["Name"].ToString());
htmlMarkup.AppendFormat("{0}<br />", drv["lastname"].ToString());
lit.Text = htmlMarkup.ToString();
}
}
正如您所看到的,我正在检索数据并以我想要的格式输出我想要的内容。