我是Windows Forms编程的新手,并不太确定编程的正确方法。
这是我的困惑。
我有一个表格:
public partial class ReconcilerConsoleWindow : Form
{
public ReconcilerConsoleWindow()
{
InitializeComponent();
SetLogText("Started");
}
public void SetLogText(String text)
{
string logInfo = DateTime.Now.TimeOfDay.ToString() + ": " + text + Environment.NewLine;
tbx_Log.AppendText(logInfo);
}
}
在我的Program.cs类中,我有以下代码:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ReconcilerConsoleWindow window = new ReconcilerConsoleWindow();
Application.Run(window);
if (CallSomeMethod() == true)
{
window.SetLogText("True");
}
}
}
现在,一旦Application.Run命令显示窗口,程序就会在此时停止。如何在窗口启动时进行进一步处理?
以上只是一个例子。我的目的是读取XMl文件并显示datagridview。随后,我观察XMl文件的更改,每次进行更改时,我都想刷新datagridview。但是,一旦控制台弹出,我如何继续我的程序并动态更改表格上显示的信息?
答案 0 :(得分:10)
Application.Run
之后的处理通常在表单的Load
事件处理程序中触发。通过双击表单上的任何空白区域,可以在Visual Studio中轻松创建Load
方法。
这样会看起来某事。
private void ReconcilerConsoleWindow_Load(object sender, EventArgs e)
{
if (CallSomeMethod())
{
this.SetLogText("True");
}
}
这是(正如其他几个答案中所述)的原因是主thread(调用Application.Run(window)
的那个)现在用于操作表格的Message Pump 。您可以使用表单或表单的事件通过消息继续在该线程上运行。或者你可以开始一个新的主题。这可以在主方法 之前调用Application.Run(window)
来完成,但大多数人会在Form_Load
或表单构造函数中执行此操作,以确保表单已设置,等。Application.Run
返回后,所有表单现已关闭。
答案 1 :(得分:3)
Application.Run
启动Windows事件处理循环。该循环将无法完成,直到您的表单关闭,此时您对其执行的操作无论如何都无关紧要。
如果您想对表单执行某些操作,请在表单的Load
事件处理程序中执行此操作。
答案 2 :(得分:2)
Program.cs并不意味着有业务规则,它应该只调用您的表单并显示它。所有数据网格加载/刷新/编辑都应在您的表单中完成。您应该使用Forms类上定义的事件,例如:OnLoad,OnUnload,OnClose和许多其他等。
答案 3 :(得分:1)
你错过了这个概念。在Windows窗体应用程序中,主线程负责运行表单。
您可以随时使用更多线程,但在Windows窗体中,我建议将BackgroundWorker组件用于并行任务: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
或定时器: http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx
答案 4 :(得分:0)
调用Application.Run(窗口)后,您将需要处理应用程序窗口内的后续内容。
在表单的代码视图中,找到以下内容(或添加它)
private void ReconcilerConsoleWindow_Load(object sender, EventArgs e)
{
//this is where you do things :)
if (CallSomeMethod() == true)
{
window.SetLogText("True");
}
}