【问题标题】:C# Forms App CollectionsC# 表单应用程序集合
【发布时间】:2008-12-17 17:33:01
【问题描述】:

我正在使用 .Net 2.0,这让我发疯了,但我可能没有做一些简单的事情,我现在太困惑了。

我有一个应用程序,其中有一个定制的对象集合,只有主窗体应该能够更改该集合的内容,所有其他窗体应该能够从中读取。

实际上只有一种其他形式,但我需要它能够在编辑定制集合中的不同项目时被多次调用。因此,让孩子形成对话是不切实际的。必须能够打开包含集合中不同项目的此表单的多个实例。

我似乎想不出一种让所有表单都围绕集合的同一个实例旋转的方法。就像我说的那样,我可能遗漏了一些明显的东西,但我已经不能正确地思考这个问题了。

编辑:哎呀!我不能很好地解释自己。所有子表单都应该能够读取和写入集合项,但我想在程序运行时一次只使用一个集合实例。

编辑 2:原来我需要的是一个单身人士。我现在在不同的项目中实施了类似的解决方案。感谢下面没有真正留下答案的评论者,我可以将其标记为正确的答案,即使他们确定了答案。

【问题讨论】:

  • 无意讽刺,但编辑后,这个问题听起来像“我如何实现单例?”。如果真的是问题,可以查看msdn.microsoft.com/en-us/library/ms998558.aspx
  • 奇怪的是,我以前从未实现过单例。我认为这可能是答案,但我不想只是站起来说,以防我错了。谢谢。
  • 顺便说一句,我还没有在他的问题上标记答案,因为我还没有时间再看这个问题......当我知道什么有效时会标记一个!

标签: c# winforms collections


【解决方案1】:

如果主表单需要读/写访问权限而其他表单不需要,那么我会将集合设为主表单的属性,该属性可在表单内读/写,但只能从表单外部读取。您可以使用以下方式执行此操作:

C#

private myCollection _MyCollection; 
public myCollection MyCollection { 
    get { return _MyCollection.AsReadOnly(); } 
    private set { _MyCollection = value; } 
} 

VB

Private _MyCollection As myCollection
Public Property MyCollection() As myCollection
  Get
     Return _MyCollection.AsReadOnly
  End Get
  Private Set(ByVal value As myCollection)
    _MyCollection = value
  End Set
End Property

然后,您可以通过引用 MyCollection 或 _MyCollection 来从表单内部引用您的集合,但从表单外部,集合将是只读的,因此不可编辑。

编辑: 编辑后,您所追求的确实像之前建议的那样是单例,这是否意味着您的表单的所有实例都应该能够编辑这个集合与否?如果是这样,则将您的集合放入静态类:

Private _MyCollection as myCollection = Nothing
Public Shared ReadOnly Property MyCollection() As myCollection
   Get
      If _MyCollection is Nothing Then _MyCollection = New myCollection
      Return _MyCollection
   End Get
End Property

现在第一次从您的一个表单中引用该集合时,它将实例化一个新集合,然后您可以从中添加/删除项目。每次您从这个或您的其他表单之一引用集合时,它已经被实例化,因此它将返回最初实例化的集合。然而,没有一种表单能够设置新集合,只需引用由单例模式实例化的集合即可。

【讨论】:

  • @Anthony:会好的。注意“.AsReadOnly()”调用。
【解决方案2】:

查看方法List<T>.AsReadOnly()

这允许您返回列表的只读包装器。

例如

private LIst<Foo> fooList; 

public ReadOnlyCollection<Foo> Foo { 
    get { return fooList.AsReadOnly(); }

【讨论】:

    【解决方案3】:

    所有表单都需要对集合进行读/写访问?那么,您现在唯一的问题是如何为您的孩子提供对这个集合的引用?你不能把它传递给子窗体的构造函数吗?或者让它成为您的主表单的公共属性(您的子表单可能可以从它们的Owner 属性中获得引用)?或者, :::shudder::: 使其成为公共静态属性?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多