我一直在使用ASP.NET代码中的DataList动态生成一些标签几天,而且在我的生活中,不能让控件显示到屏幕上。我很确定这个问题是一些小的语法问题,或者是我忘记设置的HTML标记。我已通过调试器确认数据列表实际上被拉入数据源,当我查看HTML代码“设计”视图时,控件会显示。但是,当我运行页面时,控件不可见。任何关于为什么会发生这种情况的见解都将非常感激。
以下是与问题相关的代码......
C#partial class:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InventoryService service = new InventoryService();
ArrayList foundYears = service.FindYears();
DataSet ds = new DataSet();
ds.Tables.Add("Years");
ds.Tables[0].Columns.Add("Year");
foreach (string yr in foundYears)
{
if (yr != "")
{
DataRow dr = ds.Tables[0].NewRow();
dr["Year"] = yr;
ds.Tables[0].Rows.Add(dr);
}
}
DataList headerRepeater = new DataList();
headerRepeater.DataSource = ds.Tables[0];
headerRepeater.DataKeyField = "Year";
headerRepeater.DataBind();
headerRepeater.Visible = true;
}
}
HTML partial class:
<table width="100%" align="center">
<tr>
<td style="width: 868px">
<asp:DataList id='headerRepeater' Runat='server' CellPadding='5' CellSpacing='15' GridLines='Vertical' HorizontalAlign='Left' RepeatColumns='30' RepeatDirection='Horizontal' RepeatLayout='Table' ShowFooter='False' ShowHeader='False' Visible = 'True' CssClass='DataList' DataKeyField ='Year'>
<ItemTemplate>
<asp:Label runat='server' ID='lblItemName' Text='<%# DataBinder.Eval(Container.DataItem, "Year") %>'>
</asp:Label>
</ItemTemplate>
</asp:DataList>
</td>
</tr>
<tr>
答案 0 :(得分:3)
当您说:
时,您正在创建一个新的局部变量DataList headerRepeater = new DataList(); .
从Page_Load中移除此行页面应该可以正常工作。
在触发页面加载事件时,数据列表已添加到页面控件集合
答案 1 :(得分:2)
// Why do you create a new variable named 'headerRepeater' here?
DataList headerRepeater = new DataList();
headerRepeater.DataSource = ds.Tables[0];
headerRepeater.DataKeyField = "Year";
headerRepeater.DataBind();
headerRepeater.Visible = true;
删除以下行:
DataList headerRepeater = new DataList();
答案 2 :(得分:1)
您正在创建DataList的新实例,但尚未将其添加到页面控件中。
DataList headerRepeater = new DataList(); //The problem is here
ControlThatWillHoldTheDataList.Controls.Add(headerRepeater); //My Addition
headerRepeater.DataSource = ds.Tables[0];
headerRepeater.DataKeyField = "Year";
headerRepeater.DataBind();
headerRepeater.Visible = true;