<%@ 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”
答案 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
后,请确保绑定。