如何从页面中调用用户控件的公共方法?
我在页面上的OnInit中动态加载控件。任何想法?出于某种原因,我收到一个构建错误,指出该方法不存在,即使它是公开的。开始认为用户控件不值得所有麻烦。
答案 0 :(得分:5)
你说过
Control fracTemplateCtrl =
(FracTemplateCtrl)LoadControl("FracTemplateCtrl.ascx")
fracTemplateCtrl.TestMethod();
你需要说
FracTemplateCtrl fracTemplateCtrl =
(FracTemplateCtrl)LoadControl("FracTemplateCtrl.ascx")
fracTemplateCtrl.TestMethod();
请注意fracTemplateCtrl is
声明为FracTemplateCtrl
,因此visual studio知道它有TestMethod()
。当它被声明为Control
时,visual studio无法做出这样的假设。
答案 1 :(得分:1)
您是否正在将用户控件转换为正确的类型?
答案 2 :(得分:1)
没有示例代码,很难肯定地说,但我猜你需要将对UserControl的引用转换为自定义控件的特定类型。例如,如果您的UserControl类型为“PersonControl”,那么您的代码将如下所示:
PersonControl ctl = (PersonControl)LoadControl("PersonControl.ascx");
ctl.DoCustomMethod();
答案 3 :(得分:0)
如果您的类继承自UserControl,请确保在您访问它时,就像其他人所说的那样,您正在正确地投射它。例如:
public MyControl : UserControl
{
public void MyMethod(){...}
}
在您的表单中:
private MyControl mycontrol = new MyControl();
private void MainForm()
{
this.Controls.Add(mycontrol);
InitializeComponent();
}
private void DoStuff()
{
((MyControl)mycontrol).MyMethod();
}
答案 4 :(得分:0)
迈克的回答是它是如何完成的,但Visual Studio在检测UserControl类时可能有点不稳定,并抱怨该类型不存在。在这些情况下,我必须在页面上添加<% @Reference %>
标记以强制它识别,即使它可能在web.config中被引用。