【问题标题】:Call a usercontrol’s method from a form c#?从 C# 表单调用用户控件的方法?
【发布时间】:2019-06-03 09:59:44
【问题描述】:
我在 usercontrol schuler 中有方法 listviewupdate()。
用户控件舒勒在 form1 中。
然后我有form2。当我单击 form2 中的按钮时,我想调用方法 listviewupdate()。
我尝试在 form1 中创建第二个方法,该方法调用 listviewupdate() 方法,然后在 form 2 中调用第二个方法,但出现错误。
有人可以帮帮我吗?
【问题讨论】:
标签:
c#
forms
methods
dynamic-usercontrols
【解决方案1】:
在您的文件Program.cs 中,您可以定义一个全局可访问的变量:
static class Program
{
// for external access to Form1 methods
public static Form1 MainForm;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainForm = new Form1(args);
Application.Run(MainForm);
}
}
静态变量MainForm 然后可用于通过Program.MainForm.MyMethod() 访问Form1 的任何公共方法。
假设您可以从Form1 中访问Form2 对象,您可以使用Form2 对象变量从Form1 方法中调用Form2 方法。
请注意,当(在不知不觉中......)使用多个线程时,您可能会遇到问题。阅读BeginInvoke。
【解决方案2】:
@Axel Kemper 感谢您的回复。我用Program.MainForm.MyMethod() 完成了你告诉我的操作,但它没有找到 MyMethod()。
然后我进入 form1.Designer,看到 usercontrol 设置为 private,我也将其切换为 public,现在它可以与 Program.MainForm.schuler1.MyMethod() //schuler1 is the name of my user control 一起使用。
我只是不明白为什么它不适用于
Form1 form1 = Application.OpenForms[1] as Form1;
form1.schuler1.ListviewUpdate(); //schuler1 is the name of my usercontrol
即使用户控件设置为公共,我也会在main.schuler1.ListviewUpdate(); 中收到错误“System.NullReferenceException”
【讨论】:
-
使用Application.OpenForms[0] 获取第一个表单,如here 所述。