#c# #methods #readfile #streamreader #openfiledialog
#c# #методы #readfile #streamreader #openfiledialog
Вопрос:
Я новичок в использовании C # в приложении Windows form, и я пытаюсь получить данные из открытого файла, который был прочитан в streamreader одним методом, и использовать его в другом методе.
Метод streamreader изначально использовался в:
private void mnuFileLoad_Click(object sender, EventArgs e)
{
//open file and store values into array
OpenFileDialog fileDialog = new OpenFileDialog();
//reading the file selected
if (fileDialog.ShowDialog() == DialogResult.OK)
{
//reads first line in file (size of array)
StreamReader sr = new StreamReader(fileDialog.OpenFile());
int data = int.Parse(sr.ReadLine());
}
}
Попытка перенести данные streamreader в другой метод и использовать его данные
private void btnAscending_Click(object sender, EventArgs e)
{
//reads first line in file (size of array)
StreamReader sr = new StreamReader(what do I put here);
int data = int.Parse(sr.ReadLine());
}
Как я могу использовать его данные в том методе, в котором они использовались изначально, без повторного использования команды OpenFileDialog в другом методе?
Комментарии:
1. Вы можете переместить «int data» на один уровень (область действия), и таким образом он будет доступен для обоих методов. Или вы можете вызывать другие методы с помощью методов click. Затем один из методов может передавать данные другому.
2. Переместите весь код mnuFileLoad_Click в его собственный метод и заставьте этот метод возвращать прочитанное целочисленное значение. Затем вы можете вызвать его из любого места в своем классе
Ответ №1:
Вы можете сделать это, как показано ниже. Ваши существующие методы находятся внутри класса. Чтобы привести вам пример, я поместил свои методы в класс MyClass
. У вашего класса будет другое название. Но посмотрите строку StreamReader sr = null;
, поскольку это объявление находится на уровне класса, к переменной sr теперь может быть доступен любой нестатический метод в классе. Чтобы прояснить это, я использовал this.sr один раз. Но ключевое слово this-не требуется, как вы можете видеть в другом методе ниже.
Я также добавил нулевую проверку, чтобы убедиться, что файл был открыт ранее, в противном случае вы получаете сообщение об ошибке.
Я также добавил пару комментариев, которые помогут вам в дальнейшем
class MyClass
{
StreamReader sr = null;
private void mnuFileLoad_Click(object sender, EventArgs e)
{
//open file and store values into array
OpenFileDialog fileDialog = new OpenFileDialog();
//reading the file selected
if (fileDialog.ShowDialog() == DialogResult.OK)
{
//reads first line in file (size of array)
this.sr = new StreamReader(fileDialog.OpenFile());
int data = int.Parse(sr.ReadLine());
}
}
private void btnAscending_Click(object sender, EventArgs e)
{
//reads first line in file (size of array)
// sr = new StreamReader(what do I put here); No longer required
if (sr == null)
{
// When the file wasn't opened yet, sr will be null, in this case do nothing
return;
}
// now continue using sr as planned
int data = int.Parse(sr.ReadLine());
}
}
Ответ №2:
Это во многом зависит от того, в чем заключается логика и в чем заключается ваша цель. Это не совсем понятно из вашего вопроса.
В вашем примере вы снова создаете StreamReader с комментарием о том, что первая строка должна быть прочитана снова. Таким образом, оба метода всегда должны считывать первую строку файла, правильно?
Если это так, то я бы не стал работать с потоком, но запомнил путь к файлу:
/// <summary>
/// Gets or sets the last selected file from the OpenFileDialog.
/// </summary>
private string LastSelectedFile { get; set; } = null;
/// <summary>
/// Reads the first line from the given file.
/// </summary>
/// <param name="file">The full path to the file.</param>
/// <returns>Returns the parsed content of the first line.</returns>
protected int ReadFromFile(string file)
{
using (StreamReader reader = new StreamReader(file))
{
return int.Parse(reader.ReadLine());
}
}
private void BtnFileOpen_Click(object sender, EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
if (fileDialog.ShowDialog() == DialogResult.OK)
{
this.LastSelectedFile = fileDialog.FileName;
int data = this.ReadFromFile(this.LastSelectedFile);
}
}
private void BtnSecondButton_Click(object sender, EventArgs e)
{
int data = this.ReadFromFile(this.LastSelectedFile);
}
Однако, если содержимое файла не изменится, я бы предпочел запомнить значение, считанное в свойстве, вместо последнего открытого файла:
private int FileContent { get; set; }
private void BtnFileOpen_Click(object sender, EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
if (fileDialog.ShowDialog() == DialogResult.OK)
{
using (StreamReader reader = new StreamReader(fileDialog.OpenFile()))
{
this.FileContent = int.Parse(reader.ReadLine());
}
}
}
private void BtnSecondButton_Click(object sender, EventArgs e)
{
int data = this.FileContent;
}
Если из файла необходимо прочитать другое содержимое, то вам больше подойдет ответ от AdrAs.