Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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#表单应用程序集合_C#_Winforms_Collections - Fatal编程技术网

C#表单应用程序集合

C#表单应用程序集合,c#,winforms,collections,C#,Winforms,Collections,我正在使用.NET2.0,这让我发疯,但可能有一些简单的事情我没有做,我现在太困惑而看不见 我有一个应用程序,其中有一个定制的对象集合,只有主窗体可以更改该集合的内容,所有其他窗体都可以从中读取 实际上只有一个表单,但我需要它能够在编辑定制集合中的不同项目时被多次调用。因此,使子窗体成为对话框是不切实际的。必须能够打开此表单的多个实例,其中包含集合中的不同项 我只是想不出一种方法,让所有的形式都围绕着同一个集合实例。就像我说的,我可能遗漏了一些明显的东西,但我已经不能正确地思考这个问题了 编辑:

我正在使用.NET2.0,这让我发疯,但可能有一些简单的事情我没有做,我现在太困惑而看不见

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

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

我只是想不出一种方法,让所有的形式都围绕着同一个集合实例。就像我说的,我可能遗漏了一些明显的东西,但我已经不能正确地思考这个问题了

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


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

如果主窗体需要读/写访问权限,但其他窗体不需要,那么我将使集合成为主窗体的一个属性,它可以从窗体内部读/写,但只能从窗体外部读取。您可以使用以下方法执行此操作:

C#

VB

然后,您可以通过选择引用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

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

如果主窗体需要读/写访问,而其他窗体不需要,那么我将使集合成为主窗体的一个属性,该属性可以从窗体内读/写,但只能从窗体外读。您可以使用以下方法执行此操作:

C#

VB

然后,您可以通过选择引用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

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

检查方法
List.AsReadOnly()

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

e、 g

私有列表愚人;
公共只读集合Foo{
获取{return愚人主义者。AsReadOnly();}

检查方法
列表。AsReadOnly()

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

e、 g

私有列表愚人;
公共只读集合Foo{
获取{return愚人主义者。AsReadOnly();}

所有表单都需要对集合进行读/写访问?因此,您现在唯一的问题是如何为您的子表单提供对此集合的引用?您不能将其传递给子表单的构造函数吗?或者将其作为主表单的公共属性吗(您的子表单可能会从其
所有者
属性中获得对其的引用)或者:::::::::使其成为公共静态属性?

所有表单都需要对集合进行读/写访问?那么,现在唯一的问题是如何向子表单提供对此集合的引用?您不能将其传递给子表单的构造函数吗?或者将其作为主表单的公共属性吗(您的子窗体大概可以从其
所有者
属性中获得对其的引用)?或:::::::::将其作为公共静态属性?

@Anthony:可以。注意“.AsReadOnly()”调用。@Anthony:可以。注意“.AsReadOnly()”调用。无意讽刺,但编辑后,这个问题听起来像是“如何实现单例?".如果这真的是个问题,你可以奇怪地检查一下,我以前从来没有实现过单例。我想这可能是答案,但我不想只是站起来说出来以防万一我错了。谢谢。顺便说一下,我还没有在他的答案上做过标记,因为我还没有时间再研究这个问题…当我知道答案时,我会标记一个没有讽刺的意思,但是在编辑之后,这个问题听起来像是“我如何实现一个单例?”。如果这真的是一个问题,你可以奇怪地检查一下,我以前从来没有实现过单例
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
private LIst<Foo> fooList; 

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