繁体   English   中英

从Windows窗体获取数据到C#程序

[英]Get Data from Windows Form into C# program

我希望我的C#程序收集数据。 然后,当单击OK按钮时,我希望将这些数据加载到我的程序中 - 例如加载到Main()中的变量中,或者加载到我构造的类的数据成员中,我希望表单随后消失 - 不被隐藏,但实际上是封闭的。 唉,就像我在书中所读到的那样,表格收集的数据保留在表格中,执行在表格内进行,同一表格用于显示程序计算的结果。 啧。 我想要的只是捕获表单的信息,关闭表单并继续我的程序。 我很欣赏一些关于将数据从表单发送到Main()或类的数据成员的技巧。

谢谢,幸运

你想做的事情是完全可以接受的,它只是不典型的。

当您使用Visual Studio生成WinForms项目时,它会为您创建一个表单并生成对Application.Run的调用(new Form1())。 对于此版本的Run()方法,当“主窗体”(传递给Run(),在本例中为Form1)关闭时,应用程序将退出。

Application.Run()有三个重载(版本)。 出于您的目的,您需要使用不同的重载:

Application.Run(ApplicationContext)

当您使用Run()的这个重载时,您可以控制应用程序何时退出。 简而言之,这是你可以做到的一种方式:

  • 创建一个继承ApplicationContext的类。
  • 在它的构造函数中:
    • 创建表单。
    • 订阅闭幕和闭幕活动。
    • 显示您的表单。
  • 在FormClosing事件处理程序中,从表单中获取数据。
  • 在FormClosed事件处理程序中,执行您要对数据执行的操作,然后退出线程(或执行其他操作)。

这是一个粗略的例子,但我将省略表单本身的代码。 假设表单只有一个TextBox,其Modifiers属性设置为Public。 (这不是从表单中获取数据的优雅方式,但该部分取决于您)。

namespace Me.MyDemo
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            MyApplicationContext ac = new MyApplicationContext();
            Application.Run(ac);
        }

        class MyApplicationContext : ApplicationContext
        {
            string _text = "";

            public MyApplicationContext()
            {
                Form1 f1 = new Form1();
                f1.FormClosing += new FormClosingEventHandler(f1_FormClosing);
                f1.FormClosed += new FormClosedEventHandler(f1_FormClosed);
                Console.WriteLine("I am here. Showing form in 1 second...");
                Thread.Sleep(1000);
                f1.Show();
            }

            void f1_FormClosing(object sender, FormClosingEventArgs e)
            {
                _text = (sender as Form1).textBox1.Text;
            }

            void f1_FormClosed(object sender, FormClosedEventArgs e)
            {
                Console.WriteLine("You wrote: " + _text);
                Console.WriteLine("I will go away in 2 seconds...");
                Thread.Sleep(2000);
                ExitThread();
            }
        }
    }
}

当然,您不必退出该线程。 如果程序还有其他功能,可以让它保持运行。 它只是作为一个无窗口进程运行。 请记住,你有责任最终结束它。

有关更多帮助,请查看System.Windows.Forms.Application类和ApplicationContext类的文档。

为了从表单中获取数据,有很多方法可以解决这个问题。 简单的方法是给你的表单一些公共属性。 更复杂的方法是创建数据类并在表单上使用数据绑定控件。

你是用WinForms写的吗? 据我所知,Windows应用程序必须有一个窗口,即使它是一个像素一个像素。

你有没有看到任何其他Windows应用程序以你希望你的工作方式工作? 打开一个窗口,窗口关闭,但程序继续运行? 这通常被认为是不受欢迎的行为,类似于病毒和特洛伊木马。

当然,您可以创建没有GUI的控制台应用程序或Windows服务。

输入数据后,应用程序在幕后执行的操作是什么? 如果只是进行一些计算并保存到磁盘,上传或打印,请将窗口打开,然后在完成后退出。 可能包括进度条。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM