Как передавать переменные из класса в другой класс
Перешел на 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 шт):
- В классе Form1 создать переменную "currentFolderName" и передавать в неё значение из textBox
- В классе ScanningFile создать переменную "folderName"
- В классе ScanningFile создать конструктор, принимающий строку и инициализирующий ей поле folderName
- При создании экземпляра ScanningFile передавать в него currentFolderName
new ScanningFile(currentFolderName);
Первое, что хотелось-бы отметить - предлагаю передавать не переменную, а класс. В таком случае, если вы будете дорабатывать код, не придётся менять существующий. Нужно будет лишь добавить новое свойство в класс и сделать действия для него.
Пример класса:
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. Это сильно уменьшит количество кода, повысит его читаемость и добавит немного баллов в копилку вашей кармы для человека, который будет потом в вашем коде копаться.
