表单加载后如何执行代码?

进去。NET 中,Windows 窗体有一个在加载窗体之前触发的事件(窗体。) ,但没有在窗体加载后触发的对应事件。我想在表单加载后执行一些逻辑。

有人能提出解决方案吗?

202530 次浏览

我有时使用(in Load)

this.BeginInvoke((MethodInvoker) delegate {
// some code
});

或者

this.BeginInvoke((MethodInvoker) this.SomeMethod);

(如果您正在处理“ this”以外的实例上的事件,请将“ this”更改为表单变量)。

这将调用推送到 windows-forms 循环,以便在表单处理消息队列时对其进行处理。

[应要求更新]

控制中心。调用/控制。BeginInvoke 方法旨在与线程一起使用,是将工作推送到 UI 线程的机制。通常这是由工作线程等使用。控制。调用执行同步调用,其中-as Control。BeginInvoke 执行异步调用。

通常情况下,这些文件会用作:

SomeCodeOrEventHandlerOnAWorkerThread()
{
// this code running on a worker thread...
string newText = ExpensiveMethod(); // perhaps a DB/web call


// now ask the UI thread to update itself
this.Invoke((MethodInvoker) delegate {
// this code runs on the UI thread!
this.Text = newText;
});
}

它通过将消息推送到 Windows 消息队列来完成此操作; UI 线程(在某个时刻)取消消息队列,处理委托,并向工作人员发出信号,表示它已经完成了... ... 到目前为止一切顺利;-p

如果我们使用 Control 会发生什么。调用/控制。在 UI 线程上调用 BeginInvoke? ?如果你打电话给控制中心,就能解决问题。调用,它是足够明智的,知道阻塞消息队列将导致立即死锁-因此,如果您已经在 UI 线程上,它只是立即运行代码... 所以这对我们没有帮助..。

但是老总。BeginInvoke 的工作方式不同: 它将工作推送到队列上,即使我们已经在 UI 线程上。这使得一个真正简单的方式说“在一个时刻”,但没有不便的计时器等(这仍然必须做同样的事情无论如何!).

您也可以尝试将您的代码放在窗体的 Activated 事件中,如果您希望它发生的话,就在窗体被激活的时候。如果只在第一次激活时运行,那么您需要输入一个布尔型的“已经执行”检查。

您可以使用“ Showed”事件: MSDN-表格。显示

“仅在第一次显示窗体时引发“显示”事件; 随后的最小化、最大化、还原、隐藏、显示或失效以及重新绘制不会引发此事件。”

我遇到了同样的问题,解决方法如下:

实际上,我想显示消息,并在2秒后自动关闭它。为此,我必须生成(动态)简单的形式和一个标签显示消息,停止消息为1500毫秒,让用户阅读它。并关闭动态创建的窗体。显示的事件发生在加载事件之后。所以代码就是

Form MessageForm = new Form();
MessageForm.Shown += (s, e1) => {
Thread t = new Thread(() => Thread.Sleep(1500));
t.Start();
t.Join();
MessageForm.Close();
};

你可以关闭你的形式后,一些执行. 。

//YourForm. ActiveForm. Close () ;

    LoadingForm.ActiveForm.Close();

第一次它不会启动“加载后”,
它将只注册它以启动 NEXTLoad。

private void Main_Load(object sender, System.EventArgs e)
{
//Register it to Start in Load
//Starting from the Next time.
this.Activated += AfterLoading;
}


private void AfterLoading(object sender, EventArgs e)
{
this.Activated -= AfterLoading;
//Write your code here.
}

这是一个古老的问题,更多地取决于你什么时候需要开始你的例行公事。因为没有人想要一个 null 引用异常,所以最好先检查 null,然后根据需要使用; 仅此一点就可以为您节省很多麻烦。

这类问题最常见的原因是,容器或自定义控件类型试图访问在自定义类之外初始化的属性,而这些属性尚未初始化,因此可能导致空值填充,甚至可能导致对象类型的空引用异常。这意味着您的类在完全初始化之前就已经运行了——在您完成属性设置之前等等。此类问题的另一个可能原因是何时执行自定义图形。

要回答在表单加载事件之后何时开始执行代码的问题,最好的办法是监视 WM _ Paint 消息或直接挂钩到 Paint 事件本身。为什么?只有当所有模块都已完全加载到您的窗体加载事件时,才会触发 Paintevent。注意: 当它被设置为 true 时,并不总是为 true,因此除了隐藏表单之外,它根本不用于此目的。

下面是如何在窗体加载事件之后开始执行代码的完整示例。建议您不要不必要地占用 Paintmessage 循环,因此我们将创建一个事件,该事件将开始在该循环之外执行您的代码。

using System.Windows.Forms;

命名空间 {

/// <summary>
/// Main UI form object
/// </summary>
public class Form1 : Form
{


/// <summary>
/// Main form load event handler
/// </summary>
public Form1()
{
// Initialize ONLY. Setup your controls and form parameters here. Custom controls should wait for "FormReady" before starting up too.
this.Text = "My Program title before form loaded";
// Size need to see text. lol
this.Width = 420;


// Setup the sub or fucntion that will handle your "start up" routine
this.StartUpEvent += StartUPRoutine;


// Optional: Custom control simulation startup sequence:
// Define your class or control in variable. ie. var MyControlClass new CustomControl;
// Setup your parameters only. ie. CustomControl.size = new size(420, 966); Do not validate during initialization wait until "FormReady" is set to avoid possible null values etc.
// Inside your control or class have a property and assign it as bool FormReady - do not validate anything until it is true and you'll be good!
}


/// <summary>
/// The main entry point for the application which sets security permissions when set.
/// </summary>
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}




#region "WM_Paint event hooking with StartUpEvent"
//
// Create a delegate for our "StartUpEvent"
public delegate void StartUpHandler();
//
// Create our event handle "StartUpEvent"
public event StartUpHandler StartUpEvent;
//
// Our FormReady will only be set once just he way we intendded
// Since it is a global variable we can poll it else where as well to determine if we should begin code execution !!
bool FormReady;
//
// The WM_Paint message handler: Used mostly to paint nice things to controls and screen
protected override void OnPaint(PaintEventArgs e)
{
// Check if Form is ready for our code ?
if (FormReady == false) // Place a break point here to see the initialized version of the title on the form window
{
// We only want this to occur once for our purpose here.
FormReady = true;
//
// Fire the start up event which then will call our "StartUPRoutine" below.
StartUpEvent();
}
//
// Always call base methods unless overriding the entire fucntion
base.OnPaint(e);
}
#endregion




#region "Your StartUp event Entry point"
//
// Begin executuing your code here to validate properties etc. and to run your program. Enjoy!
// Entry point is just following the very first WM_Paint message - an ideal starting place following form load
void StartUPRoutine()
{
// Replace the initialized text with the following
this.Text = "Your Code has executed after the form's load event";
//
// Anyway this is the momment when the form is fully loaded and ready to go - you can also use these methods for your classes to synchronize excecution using easy modifications yet here is a good starting point.
// Option: Set FormReady to your controls manulaly ie. CustomControl.FormReady = true; or subscribe to the StartUpEvent event inside your class and use that as your entry point for validating and unleashing its code.
//
// Many options: The rest is up to you!
}
#endregion


}

}

我知道这是一篇老文章,但我是这样做的:

    public Form1(string myFile)
{
InitializeComponent();
this.Show();
if (myFile != null)
{
OpenFile(myFile);
}
}


private void OpenFile(string myFile = null)
{
MessageBox.Show(myFile);
}

这里有一些细节添加到以前的正确答案,特别是一个由马蒂亚斯 Schippling。

在 Form1 _ Load 中添加一个事件处理程序,如下所示:

  private void Form1_Load(object sender, EventArgs e)
{
this.Shown += new EventHandler(Form1_Shown);
}

接下来,添加将对代码执行某些操作的方法

  private void Form1_Shown(Object sender, EventArgs e)
{
draw_on_my_form_or_some_other_action();
}