Как передавать переменные из класса в другой класс

Перешел на Microsoft Forms. Пишу программку на c#. Все делаю ради учения. Сделал я кнопочку на Windows Forms, при нажатии на нее я могу открывать диалог и выбирать путь к папки или файлу. А потом этот путь записывается в textBox.

Вот скриншот Windows Forms:

введите сюда описание изображения

Вот как выглядит код:

 public string foldername;
    private void button1_Click(object sender, 
        EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            foldername = folderBrowserDialog1.SelectedPath;
            textBox1.Text = foldername;
        }
    }

    private void textBox1_TextChanged(object sender,
        EventArgs e){}

Что я хочу сделать? Как наверное я понимаю, весь путь храниться в переменной "foldername". Дак вот, если же это так. То как мне использовать эту переменную в другом классе? Весь код который я показал выше, храниться в классе Form1:

public partial class Form1 : Form{/*-- Храниться код который показан выше --*/}

А вот в каком классе я хочу использовать переменную foldername:

internal class ScanningFile{/*-- Класс где должна использоваться переменная foldername --*/}

К примеру в классе ScanningFile, данная переменная foldername будет использоваться для нахождение файла txt по назначенному ей пути. После нахождение txt файлика в другую переменную к примеру в folderResult которая создана в классе ScanningFile будет записываться результат. Наверное вы меня поняли. И уже после всех этих манипуляция, переменная folderResult будет записываться в класс Form1 и там допустим будет с помощью ее отображать результат в listBox.

Я не прошу показывать как сделать нахождение txt файлов. Я хочу вызывать переменную в другом классе а после этого возвращать ее в родной класс где она и создавалась.

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


Ответы (2 шт):

Автор решения: Vitaliy Zlobin
  1. В классе Form1 создать переменную "currentFolderName" и передавать в неё значение из textBox
  2. В классе ScanningFile создать переменную "folderName"
  3. В классе ScanningFile создать конструктор, принимающий строку и инициализирующий ей поле folderName
  4. При создании экземпляра ScanningFile передавать в него currentFolderName

new ScanningFile(currentFolderName);
→ Ссылка
Автор решения: Frehzy

Первое, что хотелось-бы отметить - предлагаю передавать не переменную, а класс. В таком случае, если вы будете дорабатывать код, не придётся менять существующий. Нужно будет лишь добавить новое свойство в класс и сделать действия для него.

Пример класса:

public class Folder : INotifyPropertyChanged
{
    private string _folderName;

    public string FolderName
    {
        get => _folderName;
        set
        {
            _folderName = value;
            OnPropertyChanged(nameof(FolderName));
        }
    }

    public Folder(string folderName)
    {
        FolderName = folderName;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

У нас происходит передача в конструктор класса переменной типа string, в которой хранится folderName. Для создания экземпляра такого класса воспользуйтесь следующей конструкцией:

var folderName = "";
var folder = new Folder(folderName); //пример передачи данных через конструктор

Итак, мы сделали класс, в котором хранится какая-то информация о папке. Дальше, нам нужно привязать этот класс (точнее свойство этого класса) к textBox. Зачем? Существуют некоторые паттерны в программировании, которые говорят "Чувак, пользуйся привязкой данных. Это круто". Пример таких паттернов: MVVM, MVP и прочие.

Реализация привязки данных:

public partial class Form1 : Form
{
    private readonly Folder _folder = new(default);

    public Form1() =>
        InitializeComponent();

    private void Form1_Load(object sender, EventArgs e)
    {
        var binding = new Binding(nameof(TextBox.Text), _folder, nameof(_folder.FolderName), true, DataSourceUpdateMode.OnPropertyChanged);
        textBox1.DataBindings.Add(binding);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
            _folder.FolderName = folderBrowserDialog1.SelectedPath;
    }
}

Итак, мы создаём ПОЛЕ _folder, в котором хранится экземпляр класса Folder. Во время загрузки формы мы создаём привязку свойства Text у TextBox к СВОЙСТВУ FolderName экземпляра класса Folder (_folder).

Далее, создаём некоторую логику обновления данного свойства (button1_Click).

Как же теперь дальше:

Допустим, у нас есть Form2, в которую нужно передать данный параметр:

public partial class Form2 : Form
{
    private readonly Folder _folder;

    public Form2(Folder folder) //передача параметра
    {
        InitializeComponent();
        _folder = folder;
    }
}

Допустим, у нас есть метод, в который нужно передать данный параметр:

public void DoSome(Folder folder) //передача параметра
{
    /* logic */
}

DoSome(new Folder(default));

UPD:

Давайте представим, что мы всё же решили отказаться от привязок и сделать всё в лоб. Почистим код от привязок и добавим прямое присвоение свойству Text класса textBox1

public partial class Form1 : Form
{
    private readonly Folder _folder = new(default);

    public Form1() =>
        InitializeComponent();

    private void button1_Click(object sender, EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            _folder.FolderName = folderBrowserDialog1.SelectedPath;
            textBox1.Text = _folder.FolderName;
        }
    }
}

Либо, вообще создадим ивент изменения свойства:

public partial class Form1 : Form
{
    private readonly Folder _folder = new(default);

    public Form1() =>
        InitializeComponent();

    private void button1_Click(object sender, EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
            textBox1.Text = folderBrowserDialog1.SelectedPath;
    }

    private void textBox1_TextChanged(object sender, EventArgs e) =>
            _folder.FolderName = textBox1.Text;
}

Что мы имеем в итоге? Код гораздо меньше, меньше нужно запариваться и вообще вертел всё это ООП и паттерны. Тогда, что же будет, если вы решите чуть расширить свой код? Вам придётся опять писать "textBox1.Text = " или создавать для каждого textBox ивент на обновление Text. И так каждый раз.

А теперь представьте, что в команде вы работаете не один и какой-нибудь Вася будет так же, как и вы сидеть над кодом и так же будет посылать все эти концепции и паттерны подальше к Алану Кэю и Дядюшке Бобу. И, конечно, он будет писать везде "textBox1.Text = " или вообще создаст ивент textBox1.Change, как я писал выше. А если textBox будет несколько? И вот сейчас представьте количество ЛИШНЕГО кода, которое будет расти и расти у вас.

Вывод: Привязка - не такая сложная штука. Реализовать её можно по этому примеру буквально минут за 5. Это сильно уменьшит количество кода, повысит его читаемость и добавит немного баллов в копилку вашей кармы для человека, который будет потом в вашем коде копаться.

→ Ссылка