我希望我的C#程序收集数据。然后,当单击OK按钮时,我希望将这些数据加载到我的程序中 - 例如加载到Main()中的变量中,或者加载到我构造的类的数据成员中,我希望表单随后消失 - 不被隐藏,但实际上是封闭的。唉,就像我在书中所读到的那样,表格收集的数据保留在表格中,执行在表格内进行,同一表格用于显示程序计算的结果。啧。我想要的只是捕获表单的信息,关闭表单并继续我的程序。我很欣赏一些关于将数据从表单发送到Main()或类的数据成员的提示。
谢谢, 幸运
答案 0 :(得分:4)
你想做的事情是完全可以接受的,它只是不典型的。
当您使用Visual Studio生成WinForms项目时,它会为您创建一个表单 生成对Application.Run的调用(new Form1())。对于此版本的Run()方法,当“主窗体”(传递给Run(),在本例中为Form1)关闭时,应用程序将退出。
Application.Run()有三个重载(版本)。出于您的目的,您需要使用不同的重载:
Application.Run(ApplicationContext)
当您使用Run()的这个重载时,您可以控制应用程序何时退出。简而言之,这是你可以做到的一种方式:
这是一个粗略的例子,但我将省略表单本身的代码。假设表单只有一个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服务。
输入数据后,应用程序在幕后做了什么?如果只是进行一些计算并保存到磁盘,上传或打印,请将窗口打开,然后在完成后退出。可能包括进度条。