2010-01-13 6 views
2

J'ai 2 zones de texte et 2 [...] boutons à côté de chaque zone de texte. Est-il possible d'utiliser un OpenFileDialog et de passer le FilePath à la zone de texte respective, en fonction du bouton sur lequel on clique? c'est-à-dire ... si je clique sur un bouton et que j'ouvre la boîte de dialogue, lorsque je clique sur Ouvrir dans la boîte de dialogue, il passe le nomFichier à la première zone de texte.Réutilisation OpenFileDialog

+0

Ceci est possible. Peut-être pourriez-vous expliquer la partie de ce problème sur laquelle vous avez besoin d'aide. Essaies-tu de savoir quel bouton a été pressé? –

+0

pour ajouter ... Je respecte @Fredrik Mörk –

+0

+1 aux autres réponses, puisque les deux étaient réalisables. – David

Répondre

2

Cela a fonctionné pour moi (et il est plus simple que le d'autres postes, mais l'un d'eux travailleraient aussi bien)

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; 
} 
+1

Cela ne fonctionnera pas correctement si l'utilisateur clique sur "Annuler". –

+0

C'est correct. @ La réponse de HansPassant est meilleure. Il vérifie DialogResult.OK – David

3

Il y a plusieurs façons de le faire. L'un est d'avoir un Dictionary<Button, TextBox> qui maintient le lien entre un bouton et sa zone de texte connexe, et l'utiliser en cas de clic pour le bouton (les deux boutons peuvent être accrochés au même gestionnaire d'événements):

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; 
     } 
    } 
} 

de Bien sûr, le code ci-dessus doit être décoré avec des vérifications nulles, une bonne encapsulation de comportement et ainsi de suite, mais vous avez l'idée.

2

Oui il est, fondamentalement, vous devez garder une référence au bouton qui a été cliqué, puis une mise en correspondance d'une zone de texte à chaque bouton:

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. 
    } 
} 
4

Chaque fois que vous pensez « il y a des fonctionnalités communes! » vous devriez envisager une méthode pour l'implémenter. Cela pourrait ressembler à ceci:

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); 
    }