Коллекции приложений C # Forms - PullRequest
0 голосов
/ 17 декабря 2008

Я использую .Net 2.0, и это сводит меня с ума, но, вероятно, я не делаю какой-то простой вещи, которую я сейчас слишком смущен, чтобы видеть.

У меня есть приложение, в котором есть коллекция объектов на заказ, только основная форма должна иметь возможность изменять содержимое этой коллекции, а все другие формы могут читать из нее.

На самом деле есть только одна другая форма, но мне нужно, чтобы она могла вызываться несколько раз, так как она редактирует различные элементы в коллекции на заказ. Поэтому создавать дочерний диалог нецелесообразно. Необходима возможность открывать несколько экземпляров этой формы, содержащих различные элементы из коллекции.

Я просто не могу придумать, как заставить все формы вращаться вокруг одного и того же экземпляра коллекции. Как я уже сказал, я, вероятно, упускаю что-то очевидное, но я перестал думать о проблеме должным образом.

РЕДАКТИРОВАТЬ: Yikes! Я не мог объяснить себя очень хорошо. Все подчиненные формы должны иметь возможность читать и записывать элементы коллекции, но я хочу использовать только один экземпляр коллекции за один раз во время работы программы.

РЕДАКТИРОВАТЬ 2: Оказалось, что мне нужен был синглтон. Я реализовал подобное решение в другом проекте сейчас. Благодаря комментатору ниже, который фактически не оставил ответ, я могу пометить его как правильный, даже если они его прибили.

Ответы [ 3 ]

3 голосов
/ 17 декабря 2008

Если основной форме требуется доступ для чтения / записи, а для других форм нет, тогда я бы сделал коллекцию свойством главной формы, доступным только для чтения / записи внутри вашей формы, но предназначенным только для чтения извне формы. Вы можете сделать это, используя что-то вроде:

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

Теперь при первом обращении к коллекции из одной из ваших форм будет создана новая коллекция, из которой вы сможете добавлять / удалять элементы. Каждый раз, когда вы ссылаетесь на коллекцию из этой или одной из ваших других форм, она уже будет создана, поэтому она вернет коллекцию, которая была первоначально создана. Однако ни одна из форм не сможет установить новую коллекцию, просто укажите ссылку на экземпляр, созданный с помощью одноэлементного шаблона.

1 голос
/ 17 декабря 2008

Проверьте метод List<T>.AsReadOnly()

Это позволяет вам возвращать доступную только для чтения оболочку для списка.

, например

private LIst<Foo> fooList; 

public ReadOnlyCollection<Foo> Foo { 
    get { return fooList.AsReadOnly(); }
0 голосов
/ 17 декабря 2008

Всем формам нужен доступ на чтение / запись к коллекции? Итак, является ли ваша единственная проблема сейчас, как дать вашему ребенку формы ссылки на эту коллекцию? Разве вы не можете передать его конструктору дочерней формы? Или сделать его общедоступным свойством вашей главной формы (на которую ваши дочерние формы, вероятно, могут ссылаться из своих Owner свойств)? Или ::: shudder ::: сделать его публичным статическим свойством?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...