在表单加载

时间:2016-04-17 07:28:58

标签: c# events

我想在KeyDown上发起一个Form_Load活动,但它会把我带到Form_Load活动的其他地方。

的Form_Load:

int static_int = 0;
private void Form1_Load(object sender, EventArgs e)
{
    if(condition == true)
    {
        txtInput.Text = "something";
        txtInput.Focus();
        SendKeys.Send("{Enter}");
        int somegeneratednubmer = 20;
        static_int = static_int + somegeneratednumber;
        //somemore code here
    }

}

的KeyDown:

private void txtInput_KeyDown(object sender, KeyEventArgs e)
{
  if(e.KeyCode == Keys.Enter)
  {
      static_int = 10;
      //somemore codes here too
  }

我想得到static_intsomegeneratednumber的和,即30,但是,在调试之后,我的初始化值为0.据我所知,在{{1 } SendKeys.Send("{Enter}")事件应继续进行。

为什么不呢? 我怎样才能得到正确的结果?我真的应该在KeyDown上进行KeyDown事件,这是一个有条件的事件......
或者我在这里做错了什么? 注意:最初的static_int是在Class

上初始化的

2 个答案:

答案 0 :(得分:1)

不,KeyDown甚至会尽早进行,即从表单的消息队列中执行相应的消息。在Load事件结束之前不会发生这种情况,因为消息队列上的也是。即使情况并非如此,SendKeys也不会等待处理操作。它只是发送消息并立即返回。

另一个问题是SendKeys将虚拟密钥发送到当前活动的窗口。这永远不会成为你的窗口,因为你的窗户还没有显示出来!当某些事情表现得很奇怪时,第一步就是阅读文档。

那么,为什么static_int的值为零,而不是2030?嗯,最有可能的情况是一个未处理的例外情况,而且我非常确定当你执行tbxInput.Focus时会发生什么。控件还不存在,并且它不能成为输入焦点。如果你无法理解这一切,你可能想找一些关于Windows窗口如何工作的基础知识的书 - 没有.NET可以做些什么,而且这样的地方就是这样的(非常很漂亮).NET抽象泄漏了很多。如果您计划进行任何Windows UI开发,您至少需要了解基础知识。

但是,无论如何,这完全是不必要的。您不必执行KeyDown事件。只需创建一个从Load事件处理程序和KeyDown事件处理程序调用的方法。

答案 1 :(得分:0)

尝试添加此活动 Form1尚未加载,因此尚未发生任何事件。

private void Form1_Shown(Object sender, EventArgs e) 
{
   SendKeys.Send("{Enter}");
}

但真的这个设计是错误的