从代码隐藏中启动用户控制的正确方法是什么

时间:2009-03-23 11:25:34

标签: c# asp.net

基本上我想在代码后面创建一个用户控件,DataBind()它然后将控件插入当前页面

我正在尝试这个:

var comment = new IncidentHistoryGroupComment();
comment.LoadControl("~/Controls/IncidentHistoryGroupComment.ascx");
comment.LoadTemplate("~/Controls/IncidentHistoryGroupComment.ascx");
comment.InitializeAsUserControl(this);
comment.AttachmentActions = group.HastAttachmentActions ? group.AttachmentActions : null;
comment.Comment = group.Comment;
comment.NextStep = group.NextStep;
comment.IsInitiationStep = group.InitializationEntry != null;
comment.DataBind();

但是它内部的所有控件都是null。例如,我有一个id为pnlComments的窗格,当我尝试在IncidentHistoryGroupComment.DataBind()方法中访问它时,我得到null。我还检查了Controls属性,看看是否有什么东西,但Controls.Count == 0

所以问题是如何从后面的代码中正确初始化用户控件,以便将所有控件分配给IncidentHistoryGroupComment.designer.cs中的实例,以便我可以轻松访问它们。

3 个答案:

答案 0 :(得分:2)

MyControl myControl = (MyControl)LoadControL("~/MyControl.ascx");

为了便于阅读,我更改了控件的名称。

答案 1 :(得分:1)

应该是这样的:

 var comment = (IncidentHistoryGroupComment)Page.LoadControl("~/Controls/IncidentHistoryGroupComment.ascx");

然后你只需插入控制树

答案 2 :(得分:0)

我认为你的问题不是实例化用户控件。

在您的DataBind事件中,将此代码放在第一行:

this.EnsureChildControls();

它实例化所有子控件,如果它们没有被证实。我的意思是它检查子控件并在必要时调用createChildControl。