Best practices по использованию дублирующейся логики для контролов (WinForms) C#

316
16 июня 2017, 07:29

Подскажите, пожалуйста, как лучше сделать. Ситуация следующая: Допустим, имеется две кнопки на двух разных вкладках (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, куда будет записываться путь. И таких методов достаточно много для других контролов, т.к. интерфейсы на обеих вкладках во многом похожи и логика тоже во многом совпадает.

Какая практика применяется в подобных случаях?

Answer 1

Вынести логику в отдельный метод, например в статическом классе

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 и уже извлекать эту информацию в обработчике события, который будет один для всех кнопок этого типа.

Answer 2
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 ...
  }
}
READ ALSO
Не получаеться скачать картинку C#

Не получаеться скачать картинку C#

Нашел много всяких вопросов на эти темы но не один мне не помогаетВозьмем картинку которую я получаю с помощью vk api https://pp

305
c# Ссылка на объект [дубликат]

c# Ссылка на объект [дубликат]

На данный вопрос уже ответили:

358