【问题标题】:How can I change the extension of the file name in a SaveFileDialog when the user changes the filter?当用户更改过滤器时,如何在 SaveFileDialog 中更改文件名的扩展名?
【发布时间】:2009-07-09 16:59:06
【问题描述】:

我们的应用程序中有一个SaveFileDialog,它提供了多种格式供用户导出媒体。我们使用SaveFileDialogFilterIndex 属性确定用户选择的格式。各种格式具有不同的文件扩展名,因此我们希望用户输入的文件名在用户更改所选过滤器时更改扩展名。这可能吗?如果可以,怎么做?

编辑:我希望在显示对话框时发生这种情况,当用户更改过滤器时,以便用户获得有关文件名的反馈,而不是在用户关闭对话。我试过使用消息过滤器,但它没有收到对话框的消息。我试过Application.Idle,但在对话框运行时它永远不会触发。我尝试了后台线程,但 FilterIndex 在用户关闭对话框之前不会更新。

【问题讨论】:

  • 我猜你想更改 SaveFileDialog 中的扩展名,而不是在对话框关闭之后?在这种情况下,你应该坚持这一点。给出几个答案,这对每个人来说都不是很清楚。否则,请不要阅读我的答案!
  • 和我的回答一样,我的回答是基于 FileName 属性已经包含一个扩展名并且有两种可能性可以用过滤器改变它,如我的回答所示。
  • 好问题,如果文件名带有扩展名!如果有一个简单的答案,我很感兴趣!

标签: c# .net winforms savefiledialog


【解决方案1】:

由于 SaveFileDialog 不能被继承,我猜你必须自己构建,使用 FileDialog 作为基类。

【讨论】:

    【解决方案2】:

    当用户更改过滤器时,SaveFileDialog 会自动更改文件的扩展名。如果您想针对不同的文件格式处理某些特定操作,您可以使用以下内容:

    ...
    if (saveDialog.ShowDialog() == DialogResult.OK)
    {
        switch (saveDialog.FilterIndex)
        { 
            case 0:
                ...
                break;
            case 1:
                ...
                break;
            default:
                ...
                break;
        }
    }
    ...
    

    【讨论】:

    • SaveFileDialog 不会更改扩展名。我查过了。
    • 它改变了扩展名。相信我。
    • 这有点不切实际,因为这必须与 SaveFileDialog 的过滤器保持一致,如果有人出现并在过滤器的前面添加扩展名,那么他们必须来并找到此代码也进行更改。
    • 是的。但是你会使用字典之类的东西来存储扩展名并且只更改字典。
    • cmets中有人指出我可能不清楚。当用户可以看到表单时,它不会更改扩展名,只是之后。我需要在显示表单时更改它。
    【解决方案3】:

    添加您的过滤器:

    saveFileDialog1.Filter = "txt files (*.txt)|*.txt|Word files (*.doc)|*.doc";
    

    然后:

    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
      switch (saveFileDialog1.FilterIndex)
      {
        case 1:
          saveFileDialog1.FileName = System.IO.Path.ChangeExtension(saveFileDialog1.FileName, "txt");
          break;
        case 2:
          saveFileDialog1.FileName = System.IO.Path.ChangeExtension(saveFileDialog1.FileName, "doc");
          break;
      }
      // Here you would save your file with the filename in saveFileDialog1.FileName.
      MessageBox.Show(saveFileDialog1.FileName);
    }
    

    运行两次,首先选择“txt 文件”,然后选择“Word 文件”。输入“test”作为文件名。
    您会看到两种情况下的文件名不同:text.txt 和 test.doc。

    如果您输入的文件名带有“test.htm”之类的扩展名,则在您切换过滤器时扩展名会发生变化。

    如果您输入像“test.htm”这样的文件名并且不要更改过滤器,则开关盒会为您处理扩展名。

    【讨论】:

    • 如果他已经输入了扩展名,SaveFileDialog 确实会更改扩展名。如果他切换过滤器。如果他不这样做,扩展名不会更改,但正如 Ivan Burklov 建议的那样,他可以检查 FilterIndex,然后手动更改。
    • 文件在他保存之前不会被保存。在保存之前,他可以随意处理文件名。
    • 没有代码被改变...只是像 Ivan Burklov 建议的那样添加了 switch 语句。
    猜你喜欢
    • 2011-05-06
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多