Как использовать данные Streamreader в другом методе в C # с использованием приложения Windows form

#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.