Повторное использование OpenFileDialog - PullRequest
2 голосов
/ 14 января 2010

У меня есть 2 текстовых поля и 2 кнопки [...] рядом с каждым текстовым полем. Можно ли использовать один OpenFileDialog и передать FilePath в соответствующее текстовое поле, в зависимости от того, какая кнопка нажата? то есть ... если я нажимаю кнопку один и запускаю диалоговое окно, когда я нажимаю кнопку "Открыть" в диалоговом окне, он передает имя файла в первое текстовое поле.

Ответы [ 4 ]

4 голосов
/ 14 января 2010

Всякий раз, когда вы думаете, «есть общая функциональность!» Вы должны рассмотреть метод для его реализации. Это может выглядеть так:

    private void openFile(TextBox box) {
        if (openFileDialog1.ShowDialog(this) == DialogResult.OK) {
            box.Text = openFileDialog1.FileName;
            box.Focus();
        }
        else {
            box.Text = "";
        }
    }

    private void button1_Click(object sender, EventArgs e) {
        openFile(textBox1);
    }
3 голосов
/ 14 января 2010

Есть несколько способов сделать это. Один из них - иметь Dictionary<Button, TextBox>, который содержит ссылку между кнопкой и связанным текстовым полем, и использовать ее в событии щелчка для кнопки (обе кнопки могут быть подключены к одному и тому же обработчику событий):

public partial class TheForm : Form
{
    private Dictionary<Button, TextBox> _buttonToTextBox = new Dictionary<Button, TextBox>();
    public Form1()
    {
        InitializeComponent();
        _buttonToTextBox.Add(button1, textBox1);
        _buttonToTextBox.Add(button2, textBox2);
    }

    private void Button_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            _buttonToTextBox[sender as Button].Text = ofd.FileName;
        }
    }
}

Конечно, приведенный выше код должен быть украшен нулевыми проверками, хорошей инкапсуляцией поведения и т. Д., Но вы поймете идею.

2 голосов
/ 14 января 2010

Это работает для меня (и это проще, чем другие посты, но любой из них будет работать также)

private void button1_Click(object sender, EventArgs e)
{
    openFileDialog1.ShowDialog();
    textBox1.Text = openFileDialog1.FileName;
}

private void button2_Click(object sender, EventArgs e)
{
    openFileDialog1.ShowDialog();
    textBox2.Text = openFileDialog1.FileName;
}
2 голосов
/ 14 января 2010

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

public class MyClass
{
  public Button ClickedButtonState { get; set; }
  public Dictionary<Button, TextBox> ButtonMapping { get; set; }

  public MyClass
  {
    // setup textbox/button mapping.
  } 

   void button1_click(object sender, MouseEventArgs e)
   {
     ClickedButtonState = (Button)sender;
     openDialog();
   }

   void openDialog()
   {
     TextBox current = buttonMapping[ClickedButtonState];
     // Open dialog here with current button and textbox context.
   }
}
...