【问题标题】:C# Winforms: Is it possible to have a function in a form called from the main Program.cs?C# Winforms:是否可以从主 Program.cs 调用表单中的函数?
【发布时间】:2016-08-02 22:20:28
【问题描述】:

所以,我的 Program.cs 中有这个 Exited 事件,其中我有我的应用程序的主要入口点。它打开另一个外部程序并监视其状态。如果这个外部程序关闭,它需要在最初打开的表单上弹出一个对话框。我知道如何捕获退出的事件,但我需要使用我想要执行的操作在另一个表单上调用或运行函数。

public static class Program
{
    public static void ExternalProgramFunction()
    {
        System.Diagnostics.Process startExternal = System.Diagnostics.Process.Start("external.exe", String.Format(ConnectionArg));
        startExternal.EnableRaisingEvents = true;
        startExternal.Exited += ExternalProgramExits;
    }

    public static void ExternalProgramExits(object sender, EventArgs e)
    {
        if (UserClose == false)
        {
            /// Need code here to open dialog box on another form!!!
        }
    }
    /// The main entry point for the application.
    [STAThread]
    static void Main(string[] arguments)
    {
        UserClose = false;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Manager());

我希望这段代码执行以下以另一种形式存在的函数。我这样做是为了打开对话框并阻止表单被点击。我在下面列出的是另一种形式的一些代码。我想从 Program.cs 运行prematureclosepopup

    public Manager()
    {
        InitializeComponent();
    }
    public void PrematureClosePopup()
    {
        ManagerWarning messagepopup = new ManagerWarning();
        messagepopup.ShowDialog();
    }

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您只需要保留对您的 Manager 对象的引用:

    static Manager _someClassMemberVariable;
    

    然后将Main()中的最后一行改成:

    _someClassMemberVariable = new Manager();
    Application.Run(_someClassMemberVariable);
    

    然后您可以将您的ExternalProgramExits() 方法更改为:

    public static void ExternalProgramExits(object sender, EventArgs e)
    {
        if (UserClose == false)
        {
            _someClassMemberVariable.PrematureClosePopup();
        }
    }
    

    【讨论】:

    • 我明天会试一试。谢谢!
    • 我又在看这个,我在哪里放:静态经理_someClassMemberVariable;在 public static class Program 下或 static void Main(string[] arguments)下??
    • 作为Program 类中的顶部项目。就像上面的行public static void ExternalProgramFunction()
    • 好吧,这一切都奏效了,但遗憾的是并没有达到我希望的效果。本质上,我试图让名为“manager”的表单打开一个对话框,以便无法单击该表单。我尝试在表单代码本身中添加退出代码,但效果不佳,因此我将代码用于检查主 program.cs 中的退出状态。任何你能想到的都会有所帮助。
    • @DavidBentley 这将是ManagerWarning 的问题。我得看看它的定义。
    【解决方案2】:

    我不认为你正在尝试做的事情是开箱即用的。您可以让您的主机应用程序实现一个 TCP 套接字,然后您生成的其他应用程序充当 TCP 客户端并发送命令并获得响应,无论他们说是还是否。但是,如果您对“external.exe”程序没有任何控制权,这将不起作用。

    【讨论】:

    • 没有 2 个应用程序需要相互通信。 OP 所做的只是在同一个应用程序中调用表单上的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多