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

时间:2010-03-14 17:46:29

标签: c# windows forms

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

谢谢, 幸运

2 个答案:

答案 0 :(得分:4)

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

当您使用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类的文档。

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

答案 1 :(得分:0)

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

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

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

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