2

我有一个带有列表样式表单的 Windows 表单应用程序,其中包含父记录和任何选定父记录的许多相关子记录。

IE。拥有多张发票/报价单/信件等的客户等。

我的表单布局有一个父记录列表,当用户选择父记录时,表单上的其他列表将填充相关的子信息。所有这些列表,用户都可以打开任何记录的详细信息表单。例如,用户可以选择客户 1,然后选择详细信息,然后将打开一个客户详细信息表单,其中显示客户 1 的信息。用户可以返回并选择客户 1 的相关记录,比如说发票 1,然后打开显示发票 1 信息的发票详细信息表单。

因此,在任何时候,用户都可能打开多个发票/报价单/信函等详细表格。用户还可以选择另一个客户并完成打开详细信息表单的相同过程。

The problem I have is that when customer 1 is selected and the user wants to display the detail form I need to check all open forms to see if customer 1 detail form is already opened.

我想知道在这种情况下什么被认为是好的做法。

我试图找到一些可以以某种方式应用于所有形式的通用方法。

4

5 回答 5

1

你可以在某个地方存储一个IDictionary<Customer, Form>。这将使您能够进行简单的 O(1) 查找:

var dict = new Dictionary<Customer, Form>();
var cust = new Customer();

if(!dict.ContainsKey(cust) || dict[cust].IsDisposed)
{
    dict[cust] = new Form1();
}

dict[cust].Show();
dict[cust].Activate();

这个样本被缩短了一点:dict当然不会是本地的,也不会是cust. 它们将是一个实例字段和一个参数。

于 2012-04-25T08:32:18.587 回答
0

您可以做的是在左侧列出客户列表,并在右侧有一个包含客户信息的面板。单击客户将使用新的客户信息更新面板。

(想想资源管理器在 Windows 中的工作方式。左边是文件夹,右边是所选文件夹的信息)

面板将保存客户信息,例如发票名称和清单等。单击发票将以新形式打开发票。客户详细信息不需要以新形式打开。

于 2012-04-25T08:16:54.337 回答
0

一种方法是将表单实例存储在列表中,并尝试在打开新表单之前找到相应的实例(如果您有一些所有其他人都继承自的“基本表单”,它具有客户编号的属性,事情会变得更容易)。

您需要确保在关闭表单时删除列表项。

如果你愿意,我可以在这里提供伪代码。

于 2012-04-25T08:25:56.983 回答
0

正如我猜测的那样,您需要多次打开同一个表单,但您不需要两次显示相同的客户信息。如果是这样,那么一种选择是在您的客户详细信息表单中创建静态客户列表(例如客户 ID 列表)并检查新实例。如果客户存在于静态列表中,那么您可以取消显示或关注已打开的详细信息表单(当然如果您保存表单句柄)。

于 2012-04-25T08:27:00.603 回答
0

其他选择可能是使用 MDI 形式。打开所有表单,作为主 MDI 表单的子表单。打开新表单时,您可以随时检查它是否已经存在。

阅读这篇文章了解详情。

希望这可以帮助。

优点:无需维护已打开实例的单独列表。

于 2012-04-25T08:39:03.570 回答