将属性分配给UserControl数据绑定到asp:Repeater

时间:2013-12-23 22:08:30

标签: asp.net data-binding user-controls repeater dynamic-controls

我想知道直接将属性分配给绑定到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是错误的也是很好的。谢谢!

1 个答案:

答案 0 :(得分:0)

编辑:

您的方法存在一些问题:

  1. 您正在创建List<MyControlType>并尝试将其用作 数据源。

  2. 您正在初始化myItem并将其添加到List并希望如此 在数据绑定之后,您可以在Repeater中找到UserControl。

  3. 您正在标记中和之后将UserControl添加到Repeater DataBinding您正在转发器的项目中找到转发器 希望它具有您分配给myItem的值。

  4. <强>解决方案: 使用更好的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")
    }
    

    您可以在此处看到我们预期的结果。