Повторное использование OpenFileDialog
-
20-09-2019 - |
Вопрос
У меня есть 2 текстовых поля и 2 кнопки [...] рядом с каждым текстовым полем.Можно ли использовать один OpenFileDialog и передать FilePath в соответствующее текстовое поле в зависимости от того, какая кнопка нажата?то есть... если я нажму первую кнопку и загружу диалоговое окно, когда я нажму кнопку «Открыть» диалоговое окно, оно передаст имя файла в первое текстовое поле.
Решение
Это сработало для меня (и это проще, чем другие сообщения, но любой из них тоже подойдет)
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;
}
Другие советы
Всякий раз, когда вы думаете: «Есть общая функциональность!» Вы должны рассмотреть метод для его реализации.Это может выглядеть так:
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);
}
Есть несколько способов сделать это.Один из них – иметь 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;
}
}
}
Конечно, приведенный выше код должен быть украшен проверками на null, хорошей инкапсуляцией поведения и т. д., но суть вы поняли.
Да, это так, в основном вам нужно сохранить ссылку на кнопку, на которую нажали, а затем сопоставить текстовое поле с каждой кнопкой:
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.
}
}