我有一个具有asp gridview的转发器如下:
<asp:Repeater ID="rep" runat="server" OnItemDataBound="rep_ItemDataBound">
<ItemTemplate>
<asp:GridView ID="grdVw" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="Link" HeaderText="Link" />
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:Repeater>
然后在页面加载时,我将包含20行的datatable
绑定到此转发器:
这是我的页面加载代码
protected void Page_Load(object sender, EventArgs e){
//dummy code for testing
table.Columns.Add("Name");
table.Columns.Add("Link");
DataRow row ;
for (int i = 0; i <20; i++)
{
row = table.NewRow();
row[0] = "dsadsd";
row[1] = "text";
table.Rows.Add(row);
}
for (int i = 0; i < 10; i++)
{
ds.Tables.Add(table.Copy());
}
rep.DataSource = ds;
rep.DataBind();
}
然后我像这样处理转发器的ItemDataBoundevent
:
protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item)
{
GridView grdVw = e.Item.FindControl("grdVw") as GridView;
grdVw.DataSource = table;
grdVw.DataBind();
}
}
令人惊讶的是,结果是20个网格视图!!我认为这是因为ItemDataBound
会在table
的每一行触发。所以在这个处理程序事件中,我将表绑定了20次,但这在逻辑上是否合理,或者我做错了什么?!
我可以很容易地有一个标志来确保数据只绑定到表一次,但是如果我将数据集绑定到转发器怎么办?如何处理这种绑定到网格视图?
答案 0 :(得分:3)
更改此行代码:
rep.DataSource = ds;
到此:
rep.DataSource = ds.Tables;
答案 1 :(得分:1)
您可以使用dataset
绑定转发器,但是您需要小心处理该集合中的表格。
这样:
rep.DataSource = table;
rep.DataBind();
应该是:
rep.DataSource = {Some Dataset with more than one table};
rep.DataBind();
然后在你的处理程序中:
protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item)
{
GridView grdVw = e.Item.FindControl("grdVw") as GridView;
//EDIT: my vb was showing.
grdVw.DataSource = ((DataTable)e.Item.DataItem).Rows;
grdVw.DataBind();
}
}
这未经过测试,但它应该有点摆弄。您需要知道的是,在转发器中,您需要引用listItem的dataItem以获取对表的引用。此表也不是iEnumerable,因此请确保绑定在rows对象上。