【问题标题】:Windows Forms C#Windows 窗体 C#
【发布时间】:2012-04-25 08:09:37
【问题描述】:

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

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

我的表单布局有一个父记录列表,当用户选择父记录时,表单上的其他列表会填充相关的子信息。所有这些列表,用户都可以打开任何记录的详细表单。例如,用户可以选择客户 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.

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

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

【问题讨论】:

  • 对我最初的问题更进一步,并且在打开这些详细信息表单时使事情变得更加复杂,它们也可能包含一个列表,并且该列表可以生成某种类型的更多详细信息表单。我想它就像一棵相关表格的树。我遇到的主要问题是,如果我在此表单树中的某处删除父信息,我需要遍历所有打开的表单以查找相关的详细表单并相应地关闭它们。我看到它是一个带有 Id 和 parentId 的表,我想删除与特定 Id 相关的所有子记录......希望这是有道理的。 ——

标签: c# winforms


【解决方案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。它们将是一个实例字段和一个参数。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 对我最初的问题更进一步,并且在打开这些详细信息表单时使事情变得更加复杂,它们也可能包含一个列表,并且该列表可以生成某种类型的更多详细信息表单。我想它就像一棵相关表格的树。我遇到的主要问题是,如果我在此表单树中的某处删除父信息,我需要遍历所有打开的表单以查找相关的详细表单并相应地关闭它们。我看到它是一个带有 Id 和 parentId 的表,我想删除与特定 Id 相关的所有子记录......希望这是有道理的。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        阅读this文章了解详情。

        希望这会有所帮助。

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

        【讨论】:

          猜你喜欢
          • 2020-11-23
          • 2015-07-21
          • 1970-01-01
          • 2011-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多