Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数据从Windows窗体获取到C程序中_C#_Windows_Forms - Fatal编程技术网

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

C# 将数据从Windows窗体获取到C程序中,c#,windows,forms,C#,Windows,Forms,我想让我的C程序收集数据。然后,当单击OK按钮时,我希望将这些数据加载到我的程序中——例如加载到Main中的变量中,或者加载到我构建的类的数据成员中,然后我希望表单消失——不是隐藏,而是实际关闭。唉,正如我在书中读到的那样,表单收集的数据保留在表单中,执行在表单中进行,相同的表单用于显示程序计算的结果。嘘。我只想捕获表单的信息,关闭表单并继续我的程序。如果能提供一些将表单中的数据转换成Main或类的数据成员的技巧,我将不胜感激 谢谢, 幸运的是,你在用WinForms写作?据我所知,一个Wind

我想让我的C程序收集数据。然后,当单击OK按钮时,我希望将这些数据加载到我的程序中——例如加载到Main中的变量中,或者加载到我构建的类的数据成员中,然后我希望表单消失——不是隐藏,而是实际关闭。唉,正如我在书中读到的那样,表单收集的数据保留在表单中,执行在表单中进行,相同的表单用于显示程序计算的结果。嘘。我只想捕获表单的信息,关闭表单并继续我的程序。如果能提供一些将表单中的数据转换成Main或类的数据成员的技巧,我将不胜感激

谢谢,
幸运的是,你在用WinForms写作?据我所知,一个Windows应用程序必须有一个窗口,即使它是逐像素的

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

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


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

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

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

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


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

您想要做的是完全可以接受的,只是不典型

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

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

Application.Run(ApplicationContext)
当您使用这个Run重载时,您可以控制应用程序何时退出。简而言之,有一种方法可以做到:

创建一个继承 应用程序上下文。 在其构造中: 创建您的表单。 订阅其关闭和关闭事件。 出示你的表格。 在FormClosing事件处理程序中, 从表单中获取数据。 在FormClosed事件处理程序中,执行以下操作: 不管你想用这个做什么 然后退出线程或执行其他操作。 这里是一个粗略的示例,但我将省略表单本身的代码。假设表单只有一个文本框,其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类的文档


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

您想要做的是完全可以接受的,只是不典型

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

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

Application.Run(ApplicationContext)
当您使用这个Run重载时,您可以控制应用程序何时退出。简而言之,有一种方法可以做到:

创建一个继承 应用程序上下文。 在其构造中: 创建您的表单。 订阅其关闭和关闭事件。 出示你的表格。 在FormClosing事件处理程序中, 从表单中获取数据。 在FormClosed事件处理程序中,执行以下操作: 不管你想用这个做什么 然后退出线程或执行其他操作。 这是一个粗略的例子,但我认为 我将省略表单本身的代码。假设表单只有一个文本框,其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类的文档


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

谢谢您的回复。假设我创建了一个类,其中包含数据成员的名字、姓氏、街道地址、城市和州。我希望我的表单收集这些信息,我的类的数据成员接收这些信息以供其他用途。我正在使用常规C生成一个Windows窗体来收集信息。@Jimmy:您可以使用数据绑定查看或在button OnClick事件中设置属性。实例变量可以是表单类的字段,也可以在OnClick事件中动态创建。这是一个复杂的问题;我建议大家多学习,熟悉事件驱动编程。我非常感谢JohnSaunders、Oded、Charles M和TrueWill花时间回答我这个愚蠢的新手问题。我是一个老的VBA程序员,正在努力学习C。II似乎面临着一个选择,要么让我显示的第一个表单继续运行,直到程序结束,要么认真学习数据绑定。这对我来说是一个令人畏惧但重要的选择。我希望在这方面有任何进一步的评论。我试图创建一个OpenID帐户,以便对回复进行评级,但我遇到了问题。我道歉。我会继续努力。@Jimmy:数据绑定不会让你摆脱这个困境。你总是需要一些东西来运作这个节目。在WinForms中,这通常是一个表单。谢谢您的回复。假设我创建了一个类,其中包含数据成员的名字、姓氏、街道地址、城市和州。我希望我的表单收集这些信息,我的类的数据成员接收这些信息以供其他用途。我正在使用常规C生成一个Windows窗体来收集信息。@Jimmy:您可以使用数据绑定查看或在button OnClick事件中设置属性。实例变量可以是表单类的字段,也可以在OnClick事件中动态创建。这是一个复杂的问题;我建议大家多学习,熟悉事件驱动编程。我非常感谢JohnSaunders、Oded、Charles M和TrueWill花时间回答我这个愚蠢的新手问题。我是一个老的VBA程序员,正在努力学习C。II似乎面临着一个选择,要么让我显示的第一个表单继续运行,直到程序结束,要么认真学习数据绑定。这对我来说是一个令人畏惧但重要的选择。我希望在这方面有任何进一步的评论。我试图创建一个OpenID帐户,以便对回复进行评级,但我遇到了问题。我道歉。我会继续努力。@Jimmy:数据绑定不会让你摆脱这个困境。你总是需要一些东西来运作这个节目。在WinForms中,这通常是一种形式。