1
<%@ 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(); }

任何想法将不胜感激。

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

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

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

4

3 回答 3

3

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

<asp:Repeater id="Repeater1" ...>
 <ItemTemplate>
   <uc1:pfd ID="pfd1" runat="server" ParentItemId='<%# Eval("ItemID") %>' ... />
于 2010-03-17T18:51:19.267 回答
2

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

((PressFileDownload)e.Item.FindControl("pfd1")).ParentItemId = 0;
于 2010-03-17T19:02:33.190 回答
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.

于 2010-03-17T20:07:00.143 回答