Установите пользовательские переменные ASP.NET UserControl, когда он в повторителе - PullRequest
1 голос
/ 17 марта 2010
<%@ 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;

Мне нужно установить переменную ParentItemID для uc1: pdf, указанного внутри повторителя. Я думал, что смогу найти UC, посмотрев в e.Item и затем установив его как-нибудь. Я думаю, что это та часть, где я что-то упускаю.

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

ОБНОВЛЕНИЕ: похоже, мои элементы управления не связаны пространством имен. Я обернут родительским элементом управления (Layer) и элементом управления PressFileDownlad в пространство имен «MyControls». Также обновлены их ссылки на наследование на aspx, чтобы прочитать «MyControls.xxxxx». Я могу набрать «MyControls.Layer» внутри кода на layer.aspx.cs, но не могу получить «MyControls.PressFileDownload»

Ответы [ 3 ]

3 голосов
/ 17 марта 2010

Если вы реализуете ParentItemID как публичное свойство в своем пользовательском элементе управления, тогда вы сможете установить его декларативно, например:

<asp:Repeater id="Repeater1" ...>
 <ItemTemplate>
   <uc1:pfd ID="pfd1" runat="server" ParentItemId='<%# Eval("ItemID") %>' ... />
2 голосов
/ 17 марта 2010

Мартин прав, вы должны иметь возможность установить его декларативным способом (в случае, если ваша собственность является публичной). Но ваш путь тоже должен работать (просто правильно разыграть)

((PressFileDownload)e.Item.FindControl("pfd1")).ParentItemId = 0;
1 голос
/ 17 марта 2010

Лучший способ - реализовать событие OnDataBinding для пользовательского элемента управления. Я стараюсь избегать размещения кода в 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, в которых я храню данные. Поэтому, когда у вас есть идентификатор контейнера, просто сохраните его в переменной, которая будет доступна.

Например, в ваших .cs для вашей страницы:

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

Затем при загрузке данных просто установите свойство _containerID, и оно будет доступно в событии OnDataBinding. Просто убедитесь, что вы связываете после того, как вы установили _containerID.

...