有没有办法用 C# 在 Visual Studio 中调用已经存在的表单的函数

Posted

技术标签:

【中文标题】有没有办法用 C# 在 Visual Studio 中调用已经存在的表单的函数【英文标题】:Is there a way to call a function of an already existing form in Visual Studio with C# 【发布时间】:2022-01-05 01:25:16 【问题描述】:

有没有一种方法可以调用父表单(用户)中存在的函数,其中调用了第二个表单(addNewUser)的实例?我想要做的是当第二个表单关闭时,在父表单(用户)中执行一个函数,该函数正在更新一个表,以便在第二个表单(addNewUser)中所做的更改在第一个表单的表中更新(用户)。

a simple drawing of what I am trying to achieve

【问题讨论】:

您不应该在表单代码中直接拥有数据库访问代码,将其提取到服务类中,所有这些问题都会消失。 如果表单有对象,则可以通过对象调用实例方法,否则可以使用表单类名调用状态方法 【参考方案1】:

对于像 WinForms 这样的事件驱动范式,最好的方法是在存在可以拦截的事件时使用事件。 您可以从任何创建事件引发器实例的类订阅事件。在这种情况下,您可以简单地将事件处理程序绑定到第二个表单引发的 FormClosed 事件。

// Suppose you have a button click that opens the second form.
private void button_Click(object sender, EventArgs e)

    SecondForm f = new SecondForm();
    f.FormClosed += onSecondFormClosed;
    f.ShowDialog();


private void onSecondFormClosed(object sender, FormClosedEventArgs e)

    // Do whatever you need to do when the second form closes

【讨论】:

我一直在寻找这个,我什至无法... 如果您真的想深入了解事件业务,那么您可以开始考虑在按下添加按钮而不关闭第二个表单时引发自定义事件,这样您的用户就可以在不关闭的情况下添加另一个条目并重新打开第二种形式。自定义事件甚至可以将自定义数据发布到父表单(例如 User 类的实例,以便父级可以将信息添加到其列表中) 我用的是数据库,这样在打开第二个表单的时候可以添加多个用户。我的 onSecondFormClosed 只是从数据库中检索新信息并将其输出到我在第一个表单中拥有的 dataGridView 表中【参考方案2】:

定义全局变量以识别表单实例:

internal static Form1 CurrentForm1  get; set; 
internal static Form2 Frm2  get; set; 

那么影响变量如下:

  public Form1()
    
        InitializeComponent();
        CurrentForm1 = this;
    

您将在代码中的某处定义 Form2:

Frm2 = new Form2();

现在,您将通过 Frm2 代码访问 form1 非静态方法:

Form1.CurrentForm1.UpdateMyThings();

通过 Frm1 代码,您将能够看到 Frm2 上的内容,例如:

bool notified = false;
while (Frm2.backgroundWorker1.IsBusy)

    if (notified == false)
    
        Message("Please wait...");
        notified = true;
    
    Application.DoEvents();

在这个例子中,Frm1 检查backgroundworker #1 是否仍在Frm2 中运行(Message 函数可能会以标签或其他方式显示消息)。

【讨论】:

一个非常好的方法,我只是觉得它太复杂了(我知道它不是)我想要做的。感谢您的回复! 如果我可以分享我的想法,我还要指出这样一个事实,即以这种方式拥有全局 static 变量是非常危险的。如果您在表单关闭时不清除这些变量,您可能会遇到非常错误的情况。 谢谢@Steve 的警告,你能更准确一点吗?我使用的那些静态变量完全没有错误,也许我有一个非常具体的用途...... 如果 Frm2 关闭怎么办?变量仍然存在,指向已处理的表单。如果您在表格 (2) 关闭后再次尝试使用它,您将会崩溃。当然,我对您当前的代码和确切的上下文一无所知,所以这只是我脑海中的一个危险信号。

以上是关于有没有办法用 C# 在 Visual Studio 中调用已经存在的表单的函数的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在没有 WPF 或 Visual Studio 的情况下在 C# 中制作 GUI(仅使用代码)?

使用Unity时打开C# 弹出opening visual studio一直停在这个界面是啥情况?有啥办法解决?

Visual Studio 2017:C# 突出显示并用括号括起来

在visual studio2008上用c#写的程序应该用啥软件来画类图

在Visual Studio中使用C#有办法让一个面板缓慢移动吗?

关于c# visual studio 2005 关于datetimepicker,日期问题