Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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# Windows窗体:孤岛加载与事件断开_C#_.net_User Interface_Winforms - Fatal编程技术网

C# Windows窗体:孤岛加载与事件断开

C# Windows窗体:孤岛加载与事件断开,c#,.net,user-interface,winforms,C#,.net,User Interface,Winforms,在Windows窗体编程中,我有一个普遍的问题。在加载和填充页面时,在某些情况下,我不希望事件处理程序中的逻辑运行 事件处理代码主要用于响应用户交互,但在以编程方式操作控件时也会运行。在过去,我见过人们使用IsLoading布尔值来保护逻辑,而逻辑应该只在响应用户输入时发生。这让我觉得有点不雅观,而且开发者必须记住把它放在任何地方;当添加新功能时,这尤其是一个问题 最近,我一直在编写方法,在加载表单时断开事件处理程序的连接,然后(在finally子句中)重新连接它们。这似乎好一点,但我想知道是否

在Windows窗体编程中,我有一个普遍的问题。在加载和填充页面时,在某些情况下,我不希望事件处理程序中的逻辑运行

事件处理代码主要用于响应用户交互,但在以编程方式操作控件时也会运行。在过去,我见过人们使用IsLoading布尔值来保护逻辑,而逻辑应该只在响应用户输入时发生。这让我觉得有点不雅观,而且开发者必须记住把它放在任何地方;当添加新功能时,这尤其是一个问题


最近,我一直在编写方法,在加载表单时断开事件处理程序的连接,然后(在finally子句中)重新连接它们。这似乎好一点,但我想知道是否有更优雅的方式。有人有其他方法来处理这种情况吗?

解决这类问题最优雅的方法是使用模型视图演示者设计模式。在这里,背景代码不会直接修改控件的状态,而是修改模型,然后触发UI的更新。在WinForms的情况下,实现适当的MVP模式非常困难,但是您可以使用数据绑定将应用程序的状态与实际控件分开。正确实现绑定后,背景代码更新数据后,数据应自动显示在控件中。

解决此类问题的最优雅方法是使用模型视图演示器设计模式。在这里,背景代码不会直接修改控件的状态,而是修改模型,然后触发UI的更新。在WinForms的情况下,实现适当的MVP模式非常困难,但是您可以使用数据绑定将应用程序的状态与实际控件分开。当您正确实现绑定时,在您的背景代码更新数据后,它应该自动显示在控件中。

我认为这个问题是相关的,您会感兴趣:


我认为这个问题是相关的,你会感兴趣:

这里没有“正确”的答案,但我同意你的方法,并多次使用它。尽管无论小部件如何修改,我的事件都会被触发是件好事,但有时这正是我想要避免的。我经常在表单中编写DisableFooEventHandlers()/EnableFooEventHandlers()对方法。这让查看代码的人明白了我试图实现的目标。我尝试在匹配的方法/事件设置中使用这些设置,例如:

void BeginBulkProcessing()
{
    DisbaleFooEventHandlers();
    ...
}

void OnBulkProcessingComplete()
{
    ...
    EnableFooEventHandlers();
}
不是很吸引人,但它符合目的,而且很清楚这里发生了什么。我还没有找到更好的方法,因为最终,只有我(程序员)知道何时应该暂停处理,这很容易追踪。

这里没有“正确”的答案,但我同意你的方法,并多次使用它。尽管无论小部件如何修改,我的事件都会被触发是件好事,但有时这正是我想要避免的。我经常在表单中编写DisableFooEventHandlers()/EnableFooEventHandlers()对方法。这让查看代码的人明白了我试图实现的目标。我尝试在匹配的方法/事件设置中使用这些设置,例如:

void BeginBulkProcessing()
{
    DisbaleFooEventHandlers();
    ...
}

void OnBulkProcessingComplete()
{
    ...
    EnableFooEventHandlers();
}

不是很吸引人,但它符合目的,而且很清楚这里发生了什么。我还没有找到更好的方法,因为最终,只有我(程序员)知道何时应该暂停处理,这很容易追踪。

对-我知道怎么做,但问题是这是否是最好的模式。对-我知道怎么做,但问题是这是否是最好的模式。框架级数据绑定是否会避开已填充控件上的事件处理程序?例如_TextChanged事件?我们确实对这些表单使用MVC形式,但我的经验是,以任何方式填充控件都会触发事件处理程序。框架级别的数据绑定是否会避开已填充控件上的事件处理程序?例如_TextChanged事件?对于这些表单,我们确实使用了一种形式的MVC,但我的经验是,以任何方式填充控件都会触发事件处理程序。