2013-03-07 6 views
2

Прямо сейчас у меня есть основная форма, которая копирует файл в другой каталог.Я хочу проверить, какая кнопка была нажата

Я хочу обработать регистр «файл с тем же именем уже существует» в инструкции catch.

Я хочу, чтобы это было сделано им, появилось другое окно с вопросом, нужно ли заменять или удерживать кнопки. Затем, используя, если заявление, чтобы проверить, какая кнопка была нажата

Текущий код:

 catch (IOException x) 
      { 
       Copy copy = new Copy(); 
       copy.ShowDialog(); 
      } 

Цель:

 catch (IOException x) 
      { 
       Copy copy = new Copy(); 
       copy.ShowDialog(); 

        if (//Replace button was clicked) 
         do this 
        else if (//Keep button was clicked) 
         do this 
      } 

Я не могу показаться, чтобы найти методы, которые служат этой цели.

+2

Я предпочел бы использовать catch для исключений, с которыми я не могу справиться. Поэтому в вашем случае, если вы уже знаете, что эта проблема может возрасти, вы можете или, возможно, должны проверить, существует ли файл уже сам. – Silvermind

+2

Почему бы не использовать простой MessageBox с кнопками YesNo? (И действительно не используйте исключения для обработки таких решений. Простой File.Exists должен решить проблему) – Steve

ответ

3

Вы можете сделать свой диалог копирования вернуть DialogResult, когда кнопка нажата. Например, вы можете использовать DialogRsult.OK для кнопки «Заменить» и DialogResult.Cancel для кнопки «Сохранить». Что-то вроде этого:

При нажатии кнопки Заменить в диалоге копирования вы можете установить внутри обработчика Replace_Click событий

this.DialogResult = DialogResult.OK; 
this.Close(); 

сет аналогичным образом DialogResult.Cancel в обработчике Keep_Click событий

и вам может вызвать ваше диалоговое окно следующим образом:

Copy copy = new Copy(); 
DialogResult dr = copy.ShowDialog(); 

if(dr == DialogResult.OK) 
    //Replace clicked 
else if(dr == DialogResult.Cancel) 
    //Keep clicked 
0

Вы изучили метод Form.ShowDialog?

http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx

код Выдержки из MSDN:

public void ShowMyDialogBox() 
{ 
    Form2 testDialog = new Form2(); 

    // Show testDialog as a modal dialog and determine if DialogResult = OK. 
    if (testDialog.ShowDialog(this) == DialogResult.OK) 
    { 
     // Read the contents of testDialog's TextBox. 
     this.txtResult.Text = testDialog.TextBox1.Text; 
    } 
    else 
    { 
     this.txtResult.Text = "Cancelled"; 
    } 
    testDialog.Dispose(); 
} 
1

Вы должны рассмотреть возможность использования DialogResult класса вместо.

Вы хотите что-то вроде этого:

catch (IOException x) 
{ 
    DialogResult dr = new DialogResult(); 
    dr.ShowDialog(); 

    if (dr == DialogResult.OK) 
     MessageBox.Show ("File replaced."); 

    else if (dr == DialogResult.Cancel) 
     MessageBox.Show ("File kept."); 
} 
1

Не используйте исключения для обработки такого типа места ations.
Просто проверить, если файл существует и использовать простой MessageBox с кнопками YESNO

sourceFile = "Your_Source_File_To_Copy"; 
string destFile = Path.Combine(destFolder, Path.GetFileName(sourceFile)); 
if(File.Exists(destFile)) 
{ 
    DialogResult dr = MessageBox.Show("File already exist! Do you wish to overwrite?", 
             "Warning!", 
             MessageBoxButtons.YesNo); 
    if(dr == DialogResult.Yes) 
     // Overwrite 
    else 
     // Do something else 
} 

Как Mr Lippert says in this answer,

Исключения там помочь вам отладить программу, а не контролировать его течение.

+0

Собственно, это именно та ситуация, в которой вы не можете избежать использования исключений для управления потоком, к сожалению. Предположим, вы проверяете, есть ли файл. Хорошо, он там. Затем * между проверкой и попыткой ее открыть *, файл удаляется другим процессом. Вы получаете исключение. Предположим, что он есть, но * вы не можете записать его, потому что он заблокирован другим процессом *. Вы получаете исключение. «Экзогенные» исключения, подобные этому, указывают на то, что какой-то факт о внешнем мире не так, как ожидалось, и вам приходится иметь дело с ним. –

+0

В примере, к которому вы привязались, исключение не было экзогенным; вы можете заранее знать, будет ли исключено исключение, и поэтому вы можете избежать этого, и поэтому вам не придется его обрабатывать. Эти приятные характеристики не соответствуют файловой системе. –

+0

@EricLippert, конечно, ваш анализ очень правильный, и теперь я замечу то, что я должен был заметить сразу, однако мое мнение о шаблоне, используемом OP, по-прежнему отрицательно. Я чувствую, что внутри Исключения он пытается повторить то же самое действие, которое привело к исключению. Какие гарантии у нас есть, что проблема не повторяется бесконечно? – Steve

0

Проверка на существование файла перед копированием:

if (File.Exists(destFileName)) 
    { 
     Copy copy = new Copy(); 
     System.Windows.Forms.DialogResult res = copy.ShowDialog(); 
     if (res == System.Windows.Forms.DialogResult.Yes) 
      File.Copy(sourceFileName, destFileName, true); 
    } 
    else 
    { 
     File.Copy(sourceFileName, destFileName); 
    } 

Также установите DialogResult свойство в Copy форме надлежащим образом.

0

Возможно, реализация вашего собственного результата - это то, что вы ищете.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var result = new Form2().ShowDialog(); 
     MessageBox.Show(result.ToString()); 
    } 
} 

public partial class Form2 : Form 
{ 

    ButtonResult buttonResult; 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public new ButtonResult ShowDialog() 
    { 
     base.ShowDialog(); 
     return buttonResult; 
    } 

    private void KeepButton_Click(object sender, EventArgs e) 
    { 
     buttonResult = ButtonResult.Keep; 
     this.Close(); 
    } 

    private void ReplaceButton_Click(object sender, EventArgs e) 
    { 
     buttonResult = ButtonResult.Replace; 
     this.Close(); 
    } 
} 

public enum ButtonResult 
{ 
    None = 0, 
    Keep = 1, 
    Replace = 2, 
} 
Смежные вопросы