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、ユーザーコントロールのイベントを実装することです。可能であれば、Webフォームを使用して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 に答える