SaveFileDialog不显示

时间:2015-06-17 15:27:29

标签: c# .net winforms

编辑代码/问题。 BEGININVOKE并不长在桌子上。我在收到SaveFileDialog以显示其对话框时遇到问题。当我正常调用ShowDialog时,我根本得不到任何回应。代码失败了,就像SFD从未被调用过一样。我也试过在另一个线程中运行它。同样的问题。当我在main_load()例程中运行它时,一切正常。我使用的是.NET 4.0。 我感觉到这种情况正在发生,因为我将SFD代码作为进程退出事件的一部分进行调用。 MessageBox.Show()工作正常!!!我的示例代码如下所示。有谁知道可能导致此错误的原因是什么?谢谢!

    procConvert.Exited += new EventHandler(ConversionExited);//inside another routine

    private void ConversionExited(object sender, System.EventArgs e)
    {
        try{    
        //works fine
        MessageBox.Show("OverWrite old Gcode file " + NewGcodeName, "Warning File Exist",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button1);//works fine

        SaveFileDialog SFD = new SaveFileDialog();
        SFD.Filter = "text files (*.gcode)|*.gcode|All files (*.*)|*.*";  //set up filter for gcode and all

        DialogResult result = SFD.ShowDialog();                           //show dialog

        if (result != DialogResult.OK) return;
        NewGcodeName = SFD.FileName;
        if (File.Exists(NewGcodeName + "1")) File.Delete(NewGcodeName + "1");//erase the destination
        System.IO.File.Move(NewGcodeName, NewGcodeName + "1");//copy to backup location, smart thing to do would be to make like 5 backups then toss 
        }
        catch(Exception ex)
        {
          //handle exception
        }
    }

6 个答案:

答案 0 :(得分:1)

您在与其创建的主题不同的主题上使用SaveFileDialog 不允许这样做。

首先,您可以将前两行和NewGcodeName = SFD.FileName;放在委托定义中。但是,您仍然会遇到BeginInvoke故意异步的问题,因此当您尝试使用result变量时,您的代表将无法完成运行。要解决此问题,请尝试使用Invoke代替BeginInvoke

编辑:这个答案假设显示的代码在与GUI不同的线程上运行。如果不是,那么这个答案毫无意义,但我会问你为什么要使用BeginInvoke ...

编辑2:在仔细阅读了您的问题和评论之后,我意识到这些问题(虽然需要解决)实际上并不是导致您发布的错误消息的原因。该错误消息告诉您此代码运行的类Form或其他Control尚未显示(没有窗口句柄)。您也需要解决这个问题,以获得可行的解决方案。

答案 1 :(得分:0)

SaveFileDialog SFD = new SaveFileDialog(); SFD.Filter ="文本文件( .gcode)| .gcode |所有文件()| " ;

打开对话框

SFD.ShowDialog();

答案 2 :(得分:0)

请更好地格式化您的代码。很难读懂它。

为什么你会在这里使用BeginInvoke

问题是你在实际创建表单/控件之前调用BeginInvoke(我想你在构造函数中调用它)。尝试将代码移动到创建表单/控件后调用的位置,或删除BeginInvoke

答案 3 :(得分:0)

问题是线程。不知怎的,C#知道我从一个退出的例程调用SFD,即使我开始另一个线程。我从带有标志的计时器任务程序运行所有内容,打开/关闭SFD,一切运行完美。感谢所有人的帮助。

答案 4 :(得分:0)

您可以在.ShowDialog()

中尝试此示例 你班上的

private object sync_temp = new object();

和线程方法

SaveFileDialog save = new SaveFileDialog();
// your code to do with "save"
DialogResult result = DialogResult.None;
Action ac = () => { lock (sync_temp) {  result = save.ShowDialog(); } };
Invoke(ac);
//Thread.Sleep(10);
lock (sync_temp)
{
   if(result == DialogResult.Ok)
   {
       //
   }
}

答案 5 :(得分:0)

这是一个有点糟糕的答案,但是我在只能旋转的W10机器上遇到了这个问题。它可能与对话框所指向的初始目录有关。重新启动PC,情况有了很大改善。不是我想要的答案,而是您需要的答案。