回发后,转发器中的ASP.NET用户控件属性为null

时间:2014-10-08 19:07:20

标签: c# asp.net

看起来已经发布了几个关于此的问题,但似乎都没有解决我的问题。我在转发器中有一个用户控件。用户控件有一个公共属性,只有一个getter / setter。数据绑定在初始页面加载时很好,但是当从下拉菜单中选择过滤器时,第一个转发器绑定正常,但包含用户控件的第二个转发器显示属性为null。那么,关于实际的代码:

我的两个中继器看起来像这样:

<asp:Repeater ID="rptTransactionVisual" runat="server" OnItemDataBound="rptTransactionVisual_ItemDataBound">
            <ItemTemplate>
                <%#Eval("TransactionAmount")%> 

^ - 我进行了一次健全检查 - 它总是得到一个值,即使下面的事务收到一个空值,所以我知道它得到一个数据源并且是数据绑定                     &#34; RUNAT =&#34;服务器&#34; /&GT;                      

<asp:Repeater ID="rptTransactions" runat="server" OnItemDataBound="rptTransactions_ItemDataBound" OnDataBinding="rptTransactions_DataBinding">
                <ItemTemplate>
                    <tr>
                        <td><%#DataBinder.Eval(Container.DataItem, "TransactionDate", "{0:MM/dd/yyyy}")%></td>
                        <td><asp:Literal ID="ltlTransactionAmount" runat="server" /></td>
                        <td><asp:Literal ID="ltlClient" runat="server" /></td>
                        <td><asp:Literal ID="ltlTransactionType" runat="server" /></td>
                        <td><asp:Literal ID="ltlSector" runat="server" /></td>
                    </tr>
                </ItemTemplate>
</asp:Repeater>

我将顶级中继器的值绑定到第二个中继器的数据源,因为它们是相同的:

protected void rptTransactions_DataBinding(object sender, EventArgs e)
    {
        rptTransactionVisual.DataSource = rptTransactions.DataSource;
        rptTransactionVisual.DataBind();
    }

以下是来自用户控件的相关代码,该代码最初工作正常,但在过滤后,事务始终为null;

public Transaction transaction { get; set; }

    protected override void OnLoad(EventArgs e)
     {
        base.OnLoad(e);

        if (transaction == null) return;
....

以下是过滤的代码:

protected void ddTransactionType_SelectedIndexChanged(object sender, EventArgs e)
    {
        var transactions = getChildPages().Where(p => p.TransactionType == ddTransactionType.SelectedValue).ToList<TransactionPage>();
        }

        rptTransactions.DataSource = transactions;
        rptTransactions.DataBind();
       //databinding happens always for the list repeater, and I do see the visual repeater being databound with the correct datasource
    }

我已经把头撞在了墙上。

1 个答案:

答案 0 :(得分:1)

我仍然不知道为什么原始版本在回发后为空,但我确实通过对Visual转发器ItemDataBound事件进行了一些修改来解决它。

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            TransactionPage transaction = (TransactionPage)e.Item.DataItem;
            TransactionPagePartial visual = (TransactionPagePartial)Page.LoadControl("~/Views/Pages/Partials/TransactionPagePartial.ascx");
            visual.transaction = transaction;
            rptTransactionVisual.Controls.Add(tombstone);
        }