2

現在、ファイルを別のディレクトリにコピーするメインフォームがあります。

catchステートメントで「同じ名前のファイルがすでに存在する」というケースを処理したいと思います。

これは、ボタンを介して交換するか保持するかを尋ねる別のウィンドウをポップアップすることによって実行したいと思います。次に、ifステートメントを使用して、クリックされたボタンを確認します

現在のコード:

        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
            }

この目的に役立つ方法が見つからないようです。

4

6 に答える 6

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
于 2013-03-07T22:22:49.880 に答える
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.");
}
于 2013-03-07T22:21:24.347 に答える
1

この種の状況を処理するために例外を使用しないでください。
ファイルが存在するかどうかをテストし、YesNoボタンのある単純なMessageBoxを使用するだけです

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
}

リッパート氏がこの回答で述べているように、

例外は、プログラムのフローを制御するためではなく、プログラムをデバッグするのに役立つためにあります。

于 2013-03-07T22:23:40.087 に答える
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();
}
于 2013-03-07T22:20:01.990 に答える
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

于 2013-03-07T22:24:27.910 に答える
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,
}
于 2013-03-07T22:24:56.137 に答える