2011-06-30 11 views
5

¿Alguien puede explicar la forma más fácil de proporcionar datos a un usuario control dentro de un repetidor?¿Cómo proporcionar 'datos' al control de usuario dentro del repetidor?

Tengo el siguiente:

Default.aspx

<!-- this.GetData() returns IEnumerable<Object> --> 
<asp:Repeater runat="server" datasource='<%#this.GetData()%>'> 
    <ItemTemplate> 
     <my:CustomControl runat="server" datasource='<%#Container.DataItem %> 
    </ItemTemplate> 
</asp:Repeater> 

Codebehind

protected void Page_Load(object sender, EventArgs e) 
    { 
     this.DataBind(); 
    } 

CustomControl.ascx

<!-- Object has property Title --> 
<h1><%#this.DataSource.Title%></h1> 

Codebehind:

[System.ComponentModel.DefaultBindingProperty("DataSource")] 
public partial class CustomControl : System.Web.UI.UserControl 
{ 
    public Item DataSource { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     var x = this.DataSource; //null here 
    } 

    protected void Page_PreRender(object sender, EventArgs e) 
    { 
     var x = this.DataSource; //still null 
    } 
} 
+0

es 'this.GetData()' recibe una llamada antes o después de 'Page_Load' donde está su enlace de datos. ¿Puedes simplemente mover '.GetData()' justo antes de tu enlace de datos en 'Page_Load'? – Jay

+0

this.GetData() se llama con la expresión de enlace de datos '#'. Entonces se llama ON databinding ... – Ropstah

Respuesta

5

Se podría añadir propiedades al control de usuario a continuación, establecer estos durante el databind.

así:

<!-- this.GetData() returns IEnumerable<Object> --> 
<asp:Repeater runat="server" datasource='<%#this.GetData()%>'> 
    <ItemTemplate> 
     <my:CustomControl runat="server" title='<%#Container.DataItem.title %> 
    </ItemTemplate> 
</asp:Repeater> 

Codebehind

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.DataBind(); 
} 

CustomControl.ascx

<!-- Object has property Title --> 
<h1><%#this.Title%></h1> 

Codebehind:

[System.ComponentModel.DefaultBindingProperty("DataSource")] 
public partial class CustomControl : System.Web.UI.UserControl 
{ 
    public Item DataSource { get; set; } 

    public string title { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     var x = this.DataSource; //null here 
    } 

    protected void Page_PreRender(object sender, EventArgs e) 
    { 
     var x = this.DataSource; //still null 
    } 
} 
+0

Eso es lo que estoy haciendo ¿verdad? De alguna manera no se pasa ... – Ropstah

+0

Lo anterior es ligeramente diferente, ya que no depende de la unión de datos dentro del control de usuario, solo en el enlace de datos de la página. En el pasado, una page.databind no se propagaba a usercontrol. No puedo decirlo con certeza, pero estoy bastante seguro de que ese es el caso. –

-1

He encontrado una solución elegante en un poste diferente aquí: ASP.NET Loading a User Control in a Repeater por Anthony Pegram

Resumen:

Usando ItemDataBound del repetidor (object sender, RepeaterItemEventArgs e) evento para empujar información sobre las propiedades del control de usuario Web (que has creado).

Cuestiones relacionadas