Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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# 如何强制Show()立即执行,而不是在其他方法之后执行_C#_Winforms - Fatal编程技术网

C# 如何强制Show()立即执行,而不是在其他方法之后执行

C# 如何强制Show()立即执行,而不是在其他方法之后执行,c#,winforms,C#,Winforms,在winform项目的baseform中,用于连接数据库的代码从load事件移动到show事件。 在show事件中,在获取数据之前会调用Update(),这会使表单显示得更快,这对用户来说更愉快 但现在我在一些地方找到了代码,比如: FormRitDetail ritDetail = new FormRitDetail(); ritDetail.PrimaryKeyValue = ritID; ritDetail.Show(); ritDetail.SendSaleEmail(cancelSal

在winform项目的baseform中,用于连接数据库的代码从load事件移动到show事件。
在show事件中,在获取数据之前会调用Update(),这会使表单显示得更快,这对用户来说更愉快

但现在我在一些地方找到了代码,比如:

FormRitDetail ritDetail = new FormRitDetail();
ritDetail.PrimaryKeyValue = ritID;
ritDetail.Show();
ritDetail.SendSaleEmail(cancelSale);
ritDetail.Close();
当获取数据的代码在load事件中时,它工作得很好,但是现在它给出了一个我已经跟踪到的错误。在SendsaleMail方法中,尚未获取数据

抓取发生在Show()事件中,但c#似乎首先调用SendsaleMail,然后调用Show()

如何强制c#在编写方法时按顺序执行这些方法?
我可以在ritDetail.Show()之后调用ritDetail.Update(),我知道这一点,但是我想要一个通用的解决方案,它不需要在调用Show()方法的任何地方都编写额外的代码

这可能吗

在winform项目的baseform中,用于连接数据库的代码从load事件移动到show事件

这才是你真正的问题。要进入有效的对象状态,需要执行事件。这就是所谓的时间耦合。这就是让你体验当前问题的原因

一般的指导原则是永远不要在事件中执行业务逻辑。而是为此创建单独的方法。这些方法可以依次从事件处理程序执行

另一个问题是,你需要加载和显示一个表单,以便发送电子邮件?至少我把你的问题理解为表单将只是打开、执行和关闭。将该代码移动到一个新类,该类只负责该职责

因此,你的问题的答案是:

  • 不依赖UI事件确保加载了业务数据。它可以直接加载,但在准备好之前还不能填充到表单中
  • 表单具有UI职责。他们不应该对业务逻辑负责。创建单独的类
  • 更新

    关于实际问题,我只是检查了
    表单
    类的参考源代码。
    Show()
    方法只是更改内部状态(使用
    SetWindowLongPtr
    WinApi函数)。因此,在处理该消息之前,不会执行任何操作

    无法保证在下一次方法调用(即
    sendsalemail
    )之前完成

    在winform项目的baseform中,用于连接数据库的代码从load事件移动到show事件

    这才是你真正的问题。要进入有效的对象状态,需要执行事件。这就是所谓的时间耦合。这就是让你体验当前问题的原因

    一般的指导原则是永远不要在事件中执行业务逻辑。而是为此创建单独的方法。这些方法可以依次从事件处理程序执行

    另一个问题是,你需要加载和显示一个表单,以便发送电子邮件?至少我把你的问题理解为表单将只是打开、执行和关闭。将该代码移动到一个新类,该类只负责该职责

    因此,你的问题的答案是:

  • 不依赖UI事件确保加载了业务数据。它可以直接加载,但在准备好之前还不能填充到表单中
  • 表单具有UI职责。他们不应该对业务逻辑负责。创建单独的类
  • 更新

    关于实际问题,我只是检查了
    表单
    类的参考源代码。
    Show()
    方法只是更改内部状态(使用
    SetWindowLongPtr
    WinApi函数)。因此,在处理该消息之前,不会执行任何操作


    无法保证在下一次方法调用(即
    sendsalemail
    )之前完成。

    数据获取是否异步完成?您提供的代码应该按照您期望的方式工作。Show()->Show handlers->sendsalemail()。除非抓取是在另一个线程中异步完成的。然后立即调用sendsalemail()方法,并且不提取数据。在这种情况下,您需要实现DataFetched事件并以该事件的handlerits done旧样式执行SendSAleEmail(),方法是使用AdapterIts not done在另一个线程中填充datatable,在所示的事件中,填充datatable并将其耦合到bindingsource,它耦合到一个网格,但是该代码是在派生FormRitDetail的baseform中,这可能是一个问题吗?数据获取是异步完成的吗?您提供的代码应该按照您期望的方式工作。Show()->Show handlers->sendsalemail()。除非抓取是在另一个线程中异步完成的。然后立即调用sendsalemail()方法,并且不提取数据。在这种情况下,您需要实现DataFetched事件并以该事件的handlerits done旧样式执行SendSAleEmail(),方法是使用AdapterIts not done在另一个线程中填充datatable,在所示的事件中,填充datatable并将其耦合到bindingsource,它耦合到网格,但该代码是派生FormRitDetail的基本形式,这可能是一个问题吗?获取是一个单独的方法,在显示的事件中调用,因此这不是问题所在。我要用一个单独的类来发送电子邮件,这确实是应该的,但除此之外,我仍然想知道为什么方法A在方法B之后调用,而代码A在B之前调用。我同意这个答案的理论内容,答案在形式上是正确的,但它既不能解释也不能回答在调用sendsalemail()时没有获取数据这一事实。如果业务逻辑放在显示的处理程序中,则应在后续调用之前执行并完成处理程序。是我还是s