Domanda

<%@ 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;

ho bisogno di impostare la variabile ParentItemID per l'UC1: pdf elencati all'interno del ripetitore. Ho pensato di essere in grado di trovare uc, cercando in e.Item e quindi impostando in qualche modo. Penso che questa è la parte dove mi manca qualcosa.

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

Ogni pensiero sarebbe apprezzato.

provato anche questo con risultati simili ... quando il debug dentro la mia UserControl (pfd1) i parametri che sto cercando di impostare non è stata impostata.

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

UPDATE: Sembra che i miei controlli non sono collegati da uno spazio dei nomi. Ho avvolto dal controllo padre (Layer) e il controllo PressFileDownlad in uno spazio dei nomi "MyControls". Anche aggiornato il suo riferimento Inherits sulla aspx per leggere "MyControls.xxxxx". Sono in grado di scrivere "MyControls.Layer" all'interno del codice sul layer.aspx.cs ma non sono in grado di ottenere "MyControls.PressFileDownload"

È stato utile?

Soluzione

Se si implementa ParentItemID come una proprietà pubblica nel controllo utente, allora si dovrebbe essere in grado di impostare in modo dichiarativo, per esempio:

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

Altri suggerimenti

Martin è giusto si dovrebbe essere in grado di impostare in modo dichiarativo (nel caso in cui la vostra proprietà è pubblica). Ma il tuo modo dovrebbe funzionare anche (basta lanciare in modo corretto)

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

Il modo migliore è quello di implementare l'evento OnDataBinding per il controllo utente. Cerco di stare lontano dal mettere codice inline nel aspx utilizzando WebForms, se possibile.

Quando il ripetitore viene legato, per ogni elemento che è legato, il OnDataBinding si attiva per il controllo utente e la tua gestore può fare quello di cui ha bisogno. Non c'è bisogno di andare alla ricerca per i controlli.

Ecco un esempio:

// 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.
} 

Modifica Avviso dal tuo commento si richiedono più dati rispetto a ciò che si trova nell'origine dati. In questo caso quello che di solito fare è solo fare variabili membro private nelle .cs che memorizzano i dati in. Quindi, quando si ha l'ID del contenitore appena memorizzare in una variabile che sarà accessibile.

ad esempio, nel cs per la tua pagina:

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

Poi, quando si caricano i dati appena impostare la proprietà _containerID e sarà accessibile in caso OnDataBinding. Basta fare in modo si sono vincolanti dopo aver impostato il _containerID.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top