2012-08-03 32 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

相关问题