Диалог открытия файла продолжает отображаться даже после выбора файла C#

Я работаю с оконными формами на C# Я пытаюсь открыть файл, используя диалог openfile, когда я просматриваю свой файл и открываю его, диалог открытия файла продолжает показываться много раз.

Вот мой код для открытия файла:

private void OpenBtn_Click(object sender, EventArgs e)
{
    // Create OpenFileDialog 
    OpenFileDialog dlg = new OpenFileDialog();

    // Set filter for file extension and default file extension 
     dlg.DefaultExt = ".xml";
    dlg.Filter = "XML Files (*.xml)|*.xml";

    // Display OpenFileDialog by calling ShowDialog method 
    DialogResult result = dlg.ShowDialog();
    if (result == DialogResult.OK)
    {
        pathtext.Text = dlg.FileName;
        sourceName = dlg.FileName;
    }
    //  destFile = resultFile.Name;
    if (pathtext.Text != null)
    {
        createBtn.Enabled = true; 
    }
}

и этот обработчик события метода в форме загрузки

OpenBtn.Click += new EventHandler(this.OpenBtn_Click);

Я не вижу, где я пропустил это.

1 ответ

Решение

Единственный способ воспроизвести вашу ошибку - это дважды щелкнуть кнопку в конструкторе, чтобы он создал автоматический обработчик событий, который можно увидеть в свойствах события: введите описание изображения здесь

Если я в дополнение к этому добавлю в код ручную регистрацию события Click например в Load событие:

private void Form1_Load(object sender, EventArgs e)
{
   button2.Click += new EventHandler(this.OpenBtn_Click);
}

Тогда я получу поведение, которое диалоговое окно появляется дважды. Если я сделаю это еще раз:

private void Form1_Load(object sender, EventArgs e)
{
   button2.Click += new EventHandler(this.OpenBtn_Click);
    button2.Click += new EventHandler(this.OpenBtn_Click);
}

Это появится 3 раза! Весьма вероятно, что вы зарегистрируете это событие в цикле. Поэтому, когда выполняется первый, все остальные просто следуют. Удалите строку регистрации вручную и поместите имя обработчика события просто в свойства события.

РЕДАКТИРОВАТЬ: Основная проблема оператора += он добавляет делегатов во внутренний список, как описано в этом ответе.

Другие вопросы по тегам