2012-03-08 66 views
3
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(): 类型或命名空间名称“SaveFileDialog”找不到(是否缺少using指令或程序集引用?)是否有可能在Windows控制台应用程序

我曾尝试添加System.Windows.Forms命名空间,但我无法。

+0

你是什么意思你不能添加System.Window.Forms命名空间?你把它添加到你的参考?你收到错误信息了吗? – 2012-03-08 15:46:02

+0

我能想到做到这一点的唯一方法是为基于Windows窗体的文件操作提供单独的应用程序,然后从您的控制台应用程序调用该应用程序。 – Bridge 2012-03-08 15:48:07

+0

当然,你可以做。你可能只需要在'System.Window.Forms'上添加'reference'参数 – 2012-03-08 15:50:10

回答

10

您必须添加对System.Windows.Forms部件的参考。

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

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

    Console.ReadKey(); 
} 

但说实话,这是一个可怕的想法。控制台应用程序不应该有控制台本身的任何其他UI。由于SaveFileDialog的名称空间建议,SaveFileDialog只能用于Forms

+0

我做过,至少有一次,有需要这样做,但我同意一般来说这不是一个好主意。在我的特殊情况下,我希望能够展示一个关于对话的信息,告诉用户需要传递什么参数以及如何使用它,因为我的用户不会以其他方式了解如何为您的控制台应用程序。然而,重要的是,可以从命令行调用该程序,以便与其他程序(特别是PowerPoint)集成,而无需创建它自己的窗口。 – 2012-03-08 15:54:16

+0

谢谢它的作品:) – Nisha 2012-03-08 16:06:49

+0

这并不是一个坏主意。如果我想编写一个快速程序来执行涉及文件的内容并将其交给朋友,但不希望围绕它编写完整的UI,则只需从控制台应用程序中打开文件选择器是最容易的事情。 – dtanders 2012-03-08 16:30:29

11

您可能会发现将问题逆转并使用控制台创建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。

1

您需要将对System.Windows.Forms的引用添加到项目本身,而不是源文件。右键单击解决方案资源管理器工具箱中的项目图标,然后选择“添加参考”。

1

您已将未导入命名空间System.Windows.Forms放入您的代码中。

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

相关问题