【问题标题】:c# calling function from the main form in a childform isn't workingc#从子窗体中的主窗体调用函数不起作用
【发布时间】:2022-01-26 16:37:10
【问题描述】:

我现在被困在一个岩石和坚硬的地方之间。

我调用了我的子窗体并将其停靠在主窗体下的内容面板中。 在异步计时器之后,我关闭第一个子窗体并从主窗体调用一个函数来显示下一个子窗体,但没有任何效果。

这是我要调用的主窗体中的函数

public void ShowMainMenu()
    {
        FormMainMenu MM = new FormMainMenu();
        OpenChildForm(MM, new object());
    }

这是子窗体中的函数,用于关闭第一个子窗体,但随后调用上述函数,以显示下一个子窗体。

(它们被注释掉了,你可以注意到函数行)

public async Task DisplayMainMenu(int interval)
    {
        await Task.Delay(interval);
        this.Close();

        //FormMainBuild MB = new FormMainBuild();
        //MB.ShowMainMenu();
    }

请帮忙,我已经在网上搜索了几个小时,尝试了多个修复程序,但没有任何东西可以让我从父窗体调用 ShowMainMenu 函数。

(所有子窗体都停靠在主窗体中的面板控件下)

【问题讨论】:

  • 每当您调用 new FormMainBuild() 时,都会创建 FormMainBuild 的新 instance。然后你对这个实例执行一个调用,而不是针对已经创建并在屏幕上的实例。您需要对当前 FormMainBuild 实例的引用来要求它执行该方法。
  • 谢谢@Steve,我该怎么做?我坐在这里玩弄我的拇指atm
  • 这是X Y Problem。请告诉我们您要完成的工作,而不是要求我们尝试修复您损坏的解决方案..
  • 我在上面解释了我的情况。我有我的 MainForm 来容纳子窗体并将它们停靠在 MainForm 中的面板上。当加载表单下的计时器完成后,我想从主窗体调用一个函数。这将反过来显示第二个子表单
  • 你在做某种定时测验吗?用户起床例如45 秒内回答子表单上的问题,如果他们提前关闭子表单,很好,如果不是,它会在 45 秒后关闭?

标签: c# visual-studio


【解决方案1】:

当我想要完成我理解你想要完成的事情时,我会使用事件模式。

在您的子表单中,您希望在延迟后调用一个事件:

public partial class ChildForm : Form
{
    public event EventHandler OnWaitCompleted;

    public ChildForm(int interval)
    {
        InitializeComponent();

        WaitTime(interval);
    }

    public void WaitTime(int interval)
    {
        Task.Delay(interval).ContinueWith((MethodInvoker) =>
        {
            OnWaitCompleted?.Invoke(this, EventArgs.Empty);
        });
    }
}

然后在您的父表单中,您将在显示子表单之前设置您的事件处理操作:

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    private void btnSpawnChild_Click(object sender, EventArgs e)
    {
        ChildForm cf = new ChildForm(5000);

        cf.OnWaitCompleted += (obj, args) =>
        {
            LoadNextChild();
        };

        cf.Show(this);
    }

    private void LoadNextChild()
    {

    }
}

我认为这种方法更好,因为它避免了子表单试图控制其父表单的内容,这应该是父表单的责任。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多