将参数传递给以编程方式创建的用户控件

时间:2012-08-03 06:01:11

标签: c# asp.net user-controls controls

让我先说一下:我为此搜索了高低,并找到了许多示例和解决方案,我仍然无法解决这个问题。

在.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,并相应地填充用户控件的Web控件:

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

现在这个工作,这很好。但是我想学习/理解的是,当我在LoadControl()时,我可以将NewsArticle x传递给用户控件,这样在创建用户控件时,我可以在用户控件的Page_Load上解压缩NewsArticle,并设置实例化用户控件时的Web控件属性,而不是在使用PopulateWithNewsArticle方法实例化之后执行它(就像我现在一样)。

2 个答案:

答案 0 :(得分:2)

您可以使用

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

这个是Page.LoadControl()的重载,它有这个语法

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

之后你必须为你的UserControl创建一个有效的构造函数,这可能是这样的

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

有关此go here的更多信息。

答案 1 :(得分:2)

我们可以在NewsArticle中公开公共属性NewsArticleContainer.ascx,因此您将拥有如下的初始化代码:

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