2015-03-18 3 views
-1

Я хочу, чтобы иметь возможность ссылаться на список и просматривать все методы, а также изменять содержимое списка из других классов.Ссылка на список фигур из других классов

Вот заявление:

public partial class TestSheet : UserControl 
{ 
    public ShapeCollection _shapes = new ShapeCollection(); 
} 

Это класс ShapeCollection:

/// <summary> 
/// Manages a collection of shape objects 
/// </summary> 
public class ShapeCollection : CollectionBase 
{ 
    public void Add(Shape s) 
    { 
     List.Add(s); 
    } 

    public void Remove(Shape s) 
    { 
     List.Remove(s); 
    } 

    public Shape this[int index] 
    { 
     get { return (Shape)List[index]; } 
     set { List[index] = value; } 
    } 
} 

я могу сослаться на _shapes с помощью:

this._shapes.Add(s); 

или:

foreach (Shape s in this._shapes) 
{ 
    //some code 
} 

или по индексу в форме:

Shape shp; 
shp = (Shape)testSheet1._shapes[TestSheet.selectedShapeNumber]; 

Только классы, которые могут ссылаться на _shapes это образуют UserControl включен и сам UserControl. Как объявить _shapes по-другому, чтобы _shapes можно было ссылаться и манипулировать в других классах. Я в тупике. И я знаю, что это, наверное, что-то простое. Пожалуйста помоги.

ответ

1

Ваше заявление верное. Проблема заключается в том, где вы его объявляете. Как есть, _shapes является членом вашего TestSheet. Если вы хотите, чтобы ваша коллекция была доступна из других мест, вы должны перенести объявление в другое место, например, в качестве члена вашей формы (вместо элемента управления). Таким образом, любой класс, который имеет ссылку на форму можно ссылаться на него через

myform._shapes.Add(s); 

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

+1

OK. Таким образом, декларация должна быть в другом месте. Я был связан с сохранением кода usercontrol, поскольку я не кодировал его с помощью UserControl до этой программы. Ваше предложение имеет смысл. Спасибо. – Grid

0

Вы должны передать ссылку на _shape другим классам или передать ссылку на свой контейнер (TestSheet) другим классам.

Что-то вроде этого:

public class Manipulator { 
    private ShapeCollection shapes; 

    public Manipulator(ShapeCollection shapes) { 
     this.shapes = shapes; 
    } 

    public void doSomethingToShapes() { 
     shapes.add(...); 
    } 
} 

public static void main(String[] args) { 
    TestSheet testSheet = new TestSheet(); 
    Manipulator manipulator = new Manipulator(testSheet._shapes); 
    ... 
} 
+0

Хороший пример кода. Это очень помогло мне. Спасибо. – Grid

Смежные вопросы