Подскажите, пожалуйста, как лучше сделать. Ситуация следующая: Допустим, имеется две кнопки на двух разных вкладках (TabControl) предназначенных для открытия xml-файла. Логика первой кнопки:
private void btnOpenConfigConvert_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
txtPathConfigConvert.Text = ofd.FileName;
}
}
Логика второй кнопки:
private void btnOpenConfigImport_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
txtPathConfigImport.Text = ofd.FileName;
}
}
Как видно из примеров, отличается лишь TextBox, куда будет записываться путь. И таких методов достаточно много для других контролов, т.к. интерфейсы на обеих вкладках во многом похожи и логика тоже во многом совпадает.
Какая практика применяется в подобных случаях?
Вынести логику в отдельный метод, например в статическом классе
public static class Dialogs
{
public string GetConfigFileName()
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
return ofd.FileName;
return null;
}
}
и пример вызова:
var path = Dialogs.GetConfigFileName();
if(!string.IsNullOrWhiteSpace(path))
txtPathConfigImport.Text = path;
Передавать в метод GetConfigFileName элемент управления крайне не рекомендую, так как это накладывает сильное ограничение на его использование.
Если у вас много похожих частей на вкладках, то возможно есть смысл подумать об определении UserControl.
Грязный способ - записать название textBox для которого нужно установить текст в качестве Tag для Button и уже извлекать эту информацию в обработчике события, который будет один для всех кнопок этого типа.
private bool GetConfigFileName(out string aFileName)
{
aFileName = "";
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
aFileName = ofd.FileName;
return true;
}
return false;
}
private void btnOpenConfigImport_Click(object sender, EventArgs e)
{
string fileName;
if (GetConfigFileName(out fileName))
{
txtPathConfigImport.Text = fileName;
}
}
или
private bool GetConfigFileName(TextBox aTarget)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
aTarget.Text = ofd.FileName;
return true;
}
return false;
}
private void btnOpenConfigImport_Click(object sender, EventArgs e)
{
if (GetConfigFileName(txtPathConfigImport))
{
// if needed ...
}
}
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники