【问题标题】:IS it possible to have savefiledialog () in windows console applications是否可以在 Windows 控制台应用程序中使用 savefiledialog ()
【发布时间】:2012-03-26 02:23:51
【问题描述】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Diagnostics
{
    class Program
    {
        static void Main(string[] args)
        {
            string filename = null;
            using (SaveFileDialog sFile = new SaveFileDialog())
            {
                sFile.Filter = "Text (Tab delimited)(*.txt)|*.txt|CSV (Comma separated)(*.csv)|*.csv";
                if (sFile.ShowDialog() == DialogResult.OK)
                {
                    filename = sFile.FileName;
                    WriteRegKey(diagnostic, filename);
                }

            }
        }
    }
}

我收到一个错误: 找不到类型或命名空间名称“SaveFileDialog”(您是否缺少 using 指令或程序集引用?)

我确实尝试添加 System.Windows.Forms 命名空间,但我无法做到。

【问题讨论】:

  • 无法添加 System.Window.Forms 命名空间是什么意思?您是否将其添加到您的参考文献中?您收到错误消息了吗?
  • 我能想到的唯一方法是拥有一个单独的基于 Windows 窗体的文件操作应用程序,并从您的控制台应用程序调用它。
  • 当然可以。您可能只需将reference 添加到System.Window.Forms
  • 不,我没有将它添加到参考
  • 感谢大家的回复。现在将开始以我的方式理解问题并解决它。:)

标签: c# winforms console-application


【解决方案1】:

您必须添加对System.Windows.Forms 程序集的引用。

此外,您必须将STAThread 属性添加到您的应用程序入口点方法中。

[STAThread]
private static void Main(string[] args)
{
    using (SaveFileDialog sFile = new SaveFileDialog())
    {
        sFile.ShowDialog();
    }

    Console.ReadKey();
}

但老实说,这是一个糟糕的想法。控制台应用程序不应具有控制台本身的任何其他 UI。正如SaveFileDialog 的命名空间所建议的那样,SaveFileDialog 应该只用于Forms

【讨论】:

  • 我至少有一次需要这样做,但总的来说我同意这不是一个好主意。在我的特殊情况下,我希望能够显示一个关于对话框,告诉用户要传递什么参数以及如何使用它,因为我的用户不会了解如何使用控制台应用程序。然而,重要的是可以从命令行调用该程序以与其他程序(特别是 PowerPoint)集成,而无需创建自己的窗口。
  • 这个主意不错。如果我想编写一个快速的程序来做一些涉及文件的事情并将其交给朋友,但不想围绕它编写整个 UI,那么从控制台应用程序中打开文件选择器是最简单的事情。
  • @dtanders 如果应用程序的输入是文件名,那么您可以(应该 IMO)使用命令行参数。
  • @ken2k 不是每个人都能弄清楚这些东西。命令行参数显然比文件对话更容易从程序处理,但命令行的东西对某些人来说是可怕的巫术魔法。哦,然后尝试解释任何带有空格的路径都必须用引号括起来 - 基本上考虑您的受众。
【解决方案2】:

您可能会发现更容易解决问题并使用带有控制台的 Windows 窗体应用程序。为此,请在 Visual Studio 中创建一个 Windows 窗体应用程序。删除它创建的默认表单。打开 program.cs 并删除尝试创建窗口并将其替换为控制台应用程序代码的代码。

现在的诀窍是您需要手动创建控制台。你可以使用这个帮助类来做到这一点:

public class ConsoleHelper
{
    /// <summary>
    /// Allocates a new console for current process.
    /// </summary>
    [DllImport("kernel32.dll")]
    public static extern Boolean AllocConsole();

    /// <summary>
    /// Frees the console.
    /// </summary>
    [DllImport("kernel32.dll")]
    public static extern Boolean FreeConsole();
}

现在在你的程序开始时(在你尝试和 Console.Writeline 的之前)调用

ConsoleHelper.AllocConsole(); 

在程序调用的最后

ConsoleHelper.FreeConsole();

现在您有了一个可以创建 WinForms 对话框的控制台应用程序,包括 SaveFileDialog。

【讨论】:

    【解决方案3】:

    您需要将 System.Windows.Forms 的引用添加到项目本身,而不是源文件。右键单击Solution Explorer工具箱中的项目图标并选择“添加引用”。

    【讨论】:

      【解决方案4】:

      您没有将命名空间 System.Windows.Forms导入到您的代码中。

      您需要从“添加引用”对话框添加引用到 System.Windows.Forms。然后调用命名空间'using System.Windows.Forms'(不带引号)并使SaveFileDialog的对象类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        相关资源
        最近更新 更多