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.CancelKeep_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 回答