2012-08-03 38 views
1

讓我只是在這個前言:我谷歌搜索這個高低,並找到了很多的例子和解決方案,我仍然無法弄清楚。將一個參數傳遞給一個以編程方式創建的用戶控件

在後面文件.aspx.cs代碼,我有以下:

NewsArticleList listall = NewsArticleManager.GetListAll(); 
foreach (NewsArticle x in listall) 
{ 
    Control c1 = (NewsArticleContainer)LoadControl("~/UserControls/NewsArticleContainer.ascx"); 
    ((NewsArticleContainer)c1).PopulateWithNewsArticle(x); 
    mynewspanel.Controls.Add(c1); 
} 

我有稱爲PopulateWithNewsArticle(用戶控制的方法),它接受一個NewsArticle,並填充用戶控制的網絡控制相應:

public void PopulateWithNewsArticles(NewsArticle x) 
{ 
    lbltitle.Text = x.Title; 
    lblcategory.Text = x.Category; 
    //...etc. 
} 

現在這個工程,這是好的。但是我想學習/理解的是,我如何在LoadControl()時將NewsArticle x傳遞給用戶控件,以便在創建用戶控件時,我可以將NewsArticle解包到用戶控件的Page_Load中,並設置當用戶控件被實例化時,Web控件的屬性從右到下,而不是在用PopulateWithNewsArticle方法實例化後(如我現在擁有它)。

回答

2

我們可以在NewsArticleContainer.ascx暴露公共財產NewsArticle,所以你必須初始化代碼:

var control = (NewsArticleContainer)LoadControl("~/UserControls/NewsArticleContainer.ascx"); 
control.NewsArticle = x; 
2

你可以使用

Control c1 = 
(NewsArticleContainer)LoadControl(typeof(NewsArticleContainer),new object[]{ x }); 

這一個是一個重載的Page.LoadControl(),它的語法如下

public Control LoadControl(
    Type t, 
    Object[] parameters 
) 

之後,你將不得不爲你的用戶控件的有效構造也一樣,這可能是這樣的

class NewsArticleContainer:System.Web.UI.UserControl 
{ 
    public NewsArticleContainer(NewsArticle x) 
    { 
     // Some cool code stuff here 
    } 
} 

有關這方面的go here

+0

+1我沒有意識到LoadControl可能需要重載構造 – 2012-08-03 06:19:06

+0

這是真棒,非常感謝。我的下一個問題是,在通過重載的LoadControl()傳遞參數後,如何在用戶控件的構造函數的另一端接收和解包這些參數?它只是「知道」使用這些參數的構造函數? – CptSupermrkt 2012-08-03 06:23:26

+0

實際上,它看起來像重載需要不同的參數。如果你想使用對象數組,你不能給它一個字符串作爲路徑,但是你需要給它一個Type。 – CptSupermrkt 2012-08-03 07:22:22

相關問題