【问题标题】:I want to check which button was clicked我想检查单击了哪个按钮
【发布时间】:2013-03-07 22:11:09
【问题描述】:

现在我有一个将文件复制到另一个目录的主窗体。

我想在 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
            }

我似乎找不到适合此目的的方法。

【问题讨论】:

  • 我宁愿使用 catch 处理我无法处理的异常。因此,在您的情况下,如果您已经知道这个问题可能会出现,那么您可以或应该自己检查文件是否已经存在。
  • 为什么不使用带有 YesNo 按钮的简单 MessageBox? (并且真的不要使用异常来处理这种决定。一个简单的 File.Exists 应该可以解决问题)

标签: c# winforms visual-studio-2010 file-io


【解决方案1】:

您可以让您的“复制”对话框在单击按钮时返回DialogResult。例如,您可以将DialogRsult.OK 用于替换按钮,将DialogResult.Cancel 用于保留按钮。像这样的:

当点击复制对话框中的替换按钮时,您可以在Replace_Click 事件处理程序中进行设置

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

Keep_Click 事件处理程序中以类似的方式设置DialogResult.Cancel

你可以这样调用你的对话框:

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

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

【讨论】:

    【解决方案2】:

    您应该考虑改用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.");
    }
    

    【讨论】:

      【解决方案3】:

      不要使用异常来处理这种情况。
      只需测试文件是否存在并使用带有 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
      }
      

      作为Mr Lippert says in this answer

      有例外 帮助您调试程序,而不是控制其流程。

      【讨论】:

      • 实际上,不幸的是,这正是您无法避免使用异常来控制流程的情况。假设您检查文件是否存在。好的,它就在那里。然后在检查和尝试打开它之间,文件被另一个进程删除。你得到一个例外。假设它在那里,但是你不能写它,因为它被另一个进程锁定了。你得到一个例外。诸如此类的“外生”异常表明有关外部世界的某些事实与预期不符,您必须处理它。
      • 在您链接到的示例中,异常不是外生的;你可以提前知道是否会抛出异常,从而避免它,因此你不必处理它。这些令人愉快的特性不适用于文件系统。
      • @EricLippert 当然你的分析是非常正确的,现在我注意到一些我应该立即注意到的东西,但是我对 OP 使用的模式的看法仍然是负面的。我觉得在异常中他/她试图重复导致异常的相同动作。我们有什么保证问题不会无限期重复?
      【解决方案4】:

      您是否研究过 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();
      }
      

      【讨论】:

        【解决方案5】:

        复制前检查文件是否存在:

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

        同时在Copy 表单中适当地设置DialogResult 属性。

        【讨论】:

          【解决方案6】:

          也许实现你自己的结果就是你想要的。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-15
            • 1970-01-01
            • 2022-01-05
            • 1970-01-01
            • 1970-01-01
            • 2018-04-27
            • 1970-01-01
            相关资源
            最近更新 更多