2011-06-30 26 views
5

Ai đó có thể giải thích cách dễ nhất để cung cấp dữ liệu cho một người sử dụng kiểm soát bên trong một bộ lặp?Cách cung cấp 'dữ liệu' cho Điều khiển người dùng bên trong bộ lặp?

tôi có như sau:

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

là 'this.GetData()' được gọi trước hoặc sau 'Page_Load' nơi dữ liệu của bạn đang diễn ra. Bạn chỉ có thể di chuyển '.GetData()' sang trước khi dữ liệu của bạn trong 'Page_Load'? – Jay

+0

this.GetData() được gọi với biểu thức dữ liệu '#'. Vì vậy, nó được gọi là ON databinding ... – Ropstah

Trả lời

5

Bạn có thể thêm các thuộc tính cho điều khiển người dùng sau đó thiết lập các trong DataBind.

như thế này:

<!-- 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

Đó là những gì tôi đang làm đúng? Bằng cách nào đó nó không được thông qua ... – Ropstah

+0

Ở trên là hơi khác nhau vì nó không phụ thuộc vào databinding trong usercontrol, chỉ trên databind trang. Tôi có trong quá khứ rằng một page.databind không tuyên truyền cho usercontrol. Tôi không thể nói chắc chắn, nhưng tôi khá chắc chắn đó là trường hợp. –

-1

Tôi tìm thấy một giải pháp thanh lịch trên một bài khác nhau ở đây: ASP.NET Loading a User Control in a Repeater bởi Anthony Pegram

Tóm tắt:

Sử dụng ItemDataBound của Repeater (object sender, RepeaterItemEventArgs e) sự kiện để thúc đẩy thông tin vào thuộc tính của Web User Control của (mà bạn đã tạo).

Các vấn đề liên quan