在Repeater中设置自定义ASP.NET UserControl变量

时间:2010-03-17 18:45:11

标签: asp.net user-controls repeater findcontrol

<%@ Register Src="~/Controls/PressFileDownload.ascx" TagName="pfd" TagPrefix="uc1" %>

<asp:Repeater id="Repeater1" runat="Server" OnItemDataBound="RPTLayer_OnItemDataBound">
 <ItemTemplate>
   <asp:Label ID="LBLHeader" Runat="server" Visible="false"></asp:Label>
   <asp:Image ID="IMGThumb" Runat="server" Visible="false"></asp:Image>
   <asp:Label ID="LBLBody" Runat="server" class="layerBody"></asp:Label>
   <uc1:pfd ID="pfd1" runat="server" ShowContainerName="false" ParentContentTypeId="55" />
   <asp:Literal ID="litLayerLinks" runat="server"></asp:Literal>
 </ItemTemplate>
</asp:Repeater>

System.Web.UI.WebControls.Label lbl;
System.Web.UI.WebControls.Literal lit;
System.Web.UI.WebControls.Image img;
System.Web.UI.WebControls.HyperLink hl;
System.Web.UI.UserControl uc;

我需要为转发器中列出的uc1:pdf设置ParentItemID变量。 我以为我应该能够通过查看e.Item然后以某种方式设置它来找到uc。我认为这是我遗漏的部分。

uc = (UserControl)e.Item.FindControl("pfd1");
if (uc != null) { uc.Attributes["ParentItemID"] = i.ItemID.ToString(); }

任何想法都会受到赞赏。

也尝试了类似的结果...当我在我的usercontrol(pfd1)中调试时,我试图设置的参数尚未设置。

uc = (UserControl)e.Item.FindControl("pfd1");
if (uc != null) 
{
  uc.Attributes.Add("ContainerID", _cid.ToString());
  uc.Attributes.Add("ParentItemId", i.ItemID.ToString());
}

更新:看起来我的控件没有通过命名空间连接。我已经在命名空间“MyControls”中由父控件(Layer)和PressFileDownlad控件包装。还将其对aspx的Inherits引用更新为“MyControls.xxxxx”。我可以在layer.aspx.cs上的代码中键入“MyControls.Layer”,但我无法获得“MyControls.PressFileDownload”

3 个答案:

答案 0 :(得分:3)

如果您在用户控件中将ParentItemID实现为公共属性,那么您应该能够以声明方式设置它,例如:

<asp:Repeater id="Repeater1" ...>
 <ItemTemplate>
   <uc1:pfd ID="pfd1" runat="server" ParentItemId='<%# Eval("ItemID") %>' ... />

答案 1 :(得分:2)

马丁是对的,你应该能够以声明的方式设置它(如果你的财产是公共的)。 但是你的方式也应该有用(只需正确投射)

((PressFileDownload)e.Item.FindControl("pfd1")).ParentItemId = 0;

答案 2 :(得分:1)

最好的方法是为用户控件实现OnDataBinding事件。如果可能的话,我尽量不使用webforms将代码内联到aspx中。

当转发器绑定时,对于绑定的每个项目,OnDataBinding将为您的用户控件触发,您的处理程序可以执行所需的操作。您不必去搜索控件。

以下是一个例子:

// in your aspx
<uc1:pfd ID="pfd1" runat="server" ShowContainerName="false" ParentContentTypeId="55"
    OnDataBinding="pfd1_DataBinding" />

// in your codebehind implement the OnDataBinding event
protected void pfd1_DataBinding(object sender, System.EventArgs e)
{
    pfd uc = (pfd)(sender);
    uc.ContainerID = _containerID.ToString();
    uc.ParentItemID = Eval("ItemID");

    // Here you can do more like access other items like hidden fields
    // or cached objects or even other controls etc... Skys the limit.
} 

编辑:请注意,您需要的数据多于数据源中的数据。在这种情况下,我通常只是在我存储数据的.cs中创建私有成员变量。因此,当您拥有容器ID时,只需将其存储在可访问的变量中。

例如,在您的.cs页面中:

public partial class _TestPage : System.Web.UI.Page
{
    private int _containerID { get; set; }

然后,当您加载数据时,只需设置_containerID属性,即可在OnDataBinding事件中访问该属性。设置_containerID后,请确保绑定。