Вызов метода класса из формы без отношения к классу - PullRequest
1 голос
/ 26 марта 2012

Извините за плохой заголовок, мой разум полон путаницы, и я не знаю, как лучше это описать. Здесь идет.

У меня есть класс с именем FileHandler. Этот класс читает данные из файла и помещает их в список, а также имеет метод для записи списка обратно в файл после того, как я внес в него изменения. Класс выглядит так:

http://pastebin.com/wei5FFpB

Теперь метод readDataFile этого класса вызывается в моей основной форме (той, которая изначально загружается при запуске программы). Оттуда я открываю другую форму под названием BranchOverview. Оттуда можно открыть еще один, который называется EditProduct. В этой форме редактирования продукта я могу отредактировать сведения о продукте по ссылке и изменить его в списке myArgus. У меня проблемы с вызовом метода readDataFile в классе FileHandler из EditProduct.

Поскольку я не могу ссылаться на myArgus из EditProduct, я не могу вызвать метод writeDataFile, потому что он принимает myArgus в качестве параметра.

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

Есть ли изящный способ добиться этого или я полностью испортил всю свою программу с точки зрения дизайна? Если бы я это сделал, я был бы признателен за указание в правильном направлении, как этого добиться.

Спасибо!

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Если я правильно понимаю, ваша задача - поделиться экземпляром myArgus между тремя (или более) формами.

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

В вашем коде есть другие мелкие проблемы. Например, вам не обязательно передавать списки по ref, поскольку вы не изменяете саму ссылку, а скорее содержимое своих списков.

Тогда это выглядит ужасно:

myArgus.Add(new Branch());
myArgus[branchCounter]._branchID = Convert.ToInt32(reader.ReadLine());
myArgus[branchCounter]._branchName = reader.ReadLine();
...

пока вы действительно имеете в виду:

Branch newBranch = new Branch();

newBranch._branchID = ...;
newBranch._branchName = ...;

myArgus.Add( newBranch );

Затем, когда метод должен вернуть данные (readDataFile), я думаю, что все ожидают, что подпись будет:

public List<Branch> readDataFile()

вместо

public void readDataFile(ref List<Branch> myArgus)
0 голосов
/ 26 марта 2012

В дополнение к ответу Wiktor, ваши StreamReader и StreamWriter объекты должны быть заключены в оператор using, чтобы они правильно утилизировались даже в случае ошибки.

В вашем readDataFile методе:

using(StreamReader reader = new StreamReader(dataFileLoc))
{

    int branchCounter = 0;
    while (reader.Peek() >= 0)
    {
        .
        .
        .
    }
}

В вашем writeDataFile методе:

using(StreamWriter writer = new StreamWriter(dataFileLoc))
{
    for (int i = 0; i < myArgus.Count; i++)
    {    
        .
        .
        .
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...