2008-08-26 66 views
0

我有一個綁定到某些數據的中繼器。在轉發器中以編程方式創建UserControl?

我綁定到的ItemDataBound事件,我試圖programmaticly創建用戶控件

一言以蔽之:

void rptrTaskList_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    CCTask task = (CCTask)e.Item.DataItem; 

    if (task is ExecTask) 
    { 
     ExecTaskControl foo = new ExecTaskControl(); 
     e.Item.Controls.Add(foo); 
    } 
} 

的問題是,雖然綁定工作,用戶控件不會呈現給主頁面。

任何想法?

回答

1

嗯,想通了如何做這件事的方法:

ExecTaskControl foo = (ExecTaskControl)LoadControl("tasks\\ExecTaskControl.ascx"); 

看來愚蠢有一個文件depedancy這樣,但也許這就是用戶控件必須怎麼做。

1

你可以考慮顛倒這個問題。這是將控制權添加到中繼器定義,並在不需要時將其刪除。不知道你的應用程序的細節這可能是一個巨大的浪費時間,但它可能最終只是工作。

+0

同意的合法的方式,這聽起來像一個更好的解決方案。但這與在特定情況下適用的不一樣。 – Pete 2009-09-15 10:57:57

0

我認爲@Craig是正確的軌道上取決於你正在解決的問題的細節。將其添加到中繼器並將其刪除或設置Visible =「false」以將其隱藏在需要的位置。 Viewstate對於動態創建的控件/用戶控件來說非常棘手,所以谷歌或者如果你必須動態添加,請檢查here。還引用的文章示出了替代的方式動態地加載:

控制CTRL = this.LoadControl(Request.ApplicationPath + 「/控制/」 +控件名稱);

0

如果你打算從沒有頁面實例的地方開始,那麼你需要更進一步(例如,從web服務返回html或從任務渲染電子郵件)

var myPage = new System.Web.UI.Page(); 
var myControl = (Controls.MemberRating)myPage.LoadControl("~/Controls/MemberRating.ascx"); 

我發現斯科特Guithrie的網站這種技術,所以我認爲這是應該做它在.NET