我想知道直接将属性分配给绑定到asp:Repeater的动态创建的UserControl的最佳方法。请考虑以下代码。
在UserControl“MyControlType”的代码隐藏中:
public bool IsRetained = false;
在页面代码中:
<%@Register TagPrefix="pre" TagName="MyControlType" Src="~/MyPath/MyControl.ascx" %>
<asp:Repeater ID="repeater" DataSource='<%#dataSource%>' runat="server">
<ItemTemplate>
<pre:MyControlType runat="server" />
</ItemTemplate>
</asp:Repeater>
<asp:Button OnClick="someButton_Click" Text="Add First Item" runat="server" />
在Page codebehind中:
protected List<MyControlType> dataSource = new List<MyControlType>();
protected void someButton_Click(object sender, EventArgs e)
{
MyControlType myItem = (MyItem)Page.LoadControl("~/MyMath/MyControlType.ascx");
dataSource.Add(myItem);
myItem.IsRetained = true;
repeater.DataBind();
// test code
MyControlType realItem = repeater.Items[0].Controls[1] as MyControlType;
bool test0 = realItem.IsRetained; // false
bool test1 = myItem == realItem; // false
}
新的MyControlType成功绑定到Repeater并显示在页面上,但它没有我设置的IsRetained值。它也不是我分配给dataSource的MyControlType实例。
我可以通过获取对创建的MyControlType的引用来完成我想要的,类似于我在上面的示例中使用realItem的方式,但我更喜欢通过myItem直接分配属性。任何人都可以提供这样做的方法吗?理解为什么test0和/或test1是错误的也是很好的。谢谢!
答案 0 :(得分:0)
编辑:
您的方法存在一些问题:
您正在创建List<MyControlType>
并尝试将其用作
数据源。
您正在初始化myItem并将其添加到List并希望如此 在数据绑定之后,您可以在Repeater中找到UserControl。
您正在标记中和之后将UserControl添加到Repeater DataBinding您正在转发器的项目中找到转发器 希望它具有您分配给myItem的值。
<强>解决方案:强>
使用更好的DataSource进行测试,例如List<string>
。以下是转发器的外观(重复测试数据):
<asp:Repeater ID="repeater" runat="server">
<ItemTemplate>
<pre:MyControlType IsRetained='<%#Container.DataItem == "item 1" ? true : false %>' runat="server" />
</ItemTemplate>
</asp:Repeater>
在我的代码中,我正在测试这样:
protected void someButton_Click(object sender, EventArgs e)
{
var lst = new List<string>() { "item 1", "item 2", "item 3" };
repeater.DataSource = lst;
repeater.DataBind();
// test code
MyControlType realItem1 = repeater.Items[0].Controls[1] as MyControlType;
MyControlType realItem2 = repeater.Items[1].Controls[1] as MyControlType;
MyControlType realItem3 = repeater.Items[2].Controls[1] as MyControlType;
bool test1 = realItem1.IsRetained; // true (data == "item 1")
bool test2 = realItem2.IsRetained; // false (data != "item 1")
bool test3 = realItem3.IsRetained; // false (data != "item 1")
}
您可以在此处看到我们预期的结果。