win7中C#的winForm编程使用savefiledialog不能弹出保存窗体的解决方法

 更新时间:2014年12月30日 09:12:29   投稿:shichen2014  
这篇文章主要介绍了win7中C#的winForm编程使用savefiledialog不能弹出保存窗体的解决方法,涉及针对线程的调用问题,是比较实用的技巧,需要的朋友可以参考下

本文实例分析了win7中C#的winForm编程使用savefiledialog不能弹出保存窗体的解决方法。分享给大家供大家参考。具体分析如下:

复制代码 代码如下:
public void ResMsg()
{
    while (isRecMsg)
    {
 //准备一个数组 准备接收 服务端发来的数据
 byte[] msgRec = new byte[1024 * 1024 * 2];
 //接收服务端发来的数据,此方法也会阻断当前线程,并返回接收的数据的长度
 int recLength = sokClient.Receive(msgRec);
 switch(msgRec[0])
 {
     case 1://接收到 文件
  DialogResult reuslt = new SaveFileDialog().ShowDialog();   --- 此处有问题
  if (reuslt == System.Windows.Forms.DialogResult.OK)
  {
      using (FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create))
      {
   fs.Write(msgRec, 1, recLength - 1);
      }
      ShowMsg("文件保存完毕!" + saveFileDialog1.FileName);
  }
  break;
     case 2://接收到 字符串消息
  {
      //将数据转成字符串(要转换的数组,开始转换的下标,要转换的数据长度)
      string strRec = System.Text.Encoding.Default.GetString(msgRec, 1, recLength-1);
      //将接收到的数据显示在文本框中
      ShowMsg(strRec);
      break;
  }
     case 3://接收到 闪屏命令
  {
      ShakeWindow();
      break;
  }
 }
    }
}

客户端和服务器传输文件时, 服务器端都显示发送成功了,但是到客户端保存时,savefiledialog 保存对话框就是弹不来?!!

仔细的检查代码好几遍,逻辑上没有错误。就是弹不出来,很无语了。就上网查了,查了很多资料,没有什么头绪。在查的过程中,我看见这样的一句话“你前面都说了,你使用线程调用,那么这个线程是否为主线程?如果不是主线程,那么你应该把它交给主线程去处理”,然后我就用一个例子模拟了一下,确实有关系。

模拟的例子:

复制代码 代码如下:
public partial class Form1 : Form
{
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(saveDialog);
            t.IsBackground = true;
            //t.ApartmentState = ApartmentState.STA;//缺少这句话,就会出错误。

    //不过以上这句在Vs 2010中显示是被微软否决的,过时的,虽然还能用。但是为了更好的兼容版本,微软推出以下方法:

    t.SetApartmentState(ApartmentState.STA);  //即是在线程启动时设置它的单元状态,这里设置它的状态为单线程单元


            t.Start();
        }

        public void saveDialog()
        {
            SaveFileDialog result = new SaveFileDialog();
            result.ShowDialog();
        }
}

模拟的例子:缺少这句话【t.ApartmentState = ApartmentState.STA】,就会出错误。但在vs2010中设置方式变为t.SetApartmentState(ApartmentState.STA);//即是在线程启动时设置它的单元状态,这里设置它的状态为单线程单元

同理  savefiledialog 保存对话框就是弹不来???是不是也是这个问题啊?经过尝试后,还真是这的问题。

就这么简简单单的一句话,就花费了我两个多小时,但最后解决了,也很高兴,并且在找的过程中收获了不少。这就是有失必有得吧!

希望本文所述对大家的C#程序设计有所帮助。

相关文章

  • c# 通过内存映射实现文件共享内存的示例代码

    c# 通过内存映射实现文件共享内存的示例代码

    这篇文章主要介绍了c# 通过内存映射实现文件共享内存的示例代码,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • c#程序删除自身代码示例分享

    c#程序删除自身代码示例分享

    偶然看到一个可以自删除的程序,于是了解下如何实现。然后整理如下,需要的朋友可以参考下
    2014-03-03
  • c#之圆形无标题栏椭圆窗体的实现详解

    c#之圆形无标题栏椭圆窗体的实现详解

    本篇文章是对c#中圆形无标题栏椭圆窗体的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#利用VS中插件打包并发布winfrom程序

    C#利用VS中插件打包并发布winfrom程序

    这篇文章主要为大家详细介绍了C#利用VS中插件打包并发布winfrom程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • C#基础知识之GetType与typeof的区别小结

    C#基础知识之GetType与typeof的区别小结

    在比较对象时,需要了解他们的类型,才能决定他们的值是否能比较。所有的类都从System.Object中继承了GetType()方法,常常与typeo()运算符一起使用。这篇文章主要给大家介绍了关于C#基础知识之GetType与typeof区别的相关资料,需要的朋友可以参考下
    2021-06-06
  • C#表达式树基础教程

    C#表达式树基础教程

    这篇文章介绍了C#表达式树的基础教程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C#遍历List并删除某个元素的方法

    C#遍历List并删除某个元素的方法

    这篇文章主要介绍了C#遍历List并删除某个元素的方法,实例分析了正序与倒序遍历list及删除元素的使用技巧,需要的朋友可以参考下
    2015-02-02
  • C#实现图片上传与浏览切换的方法

    C#实现图片上传与浏览切换的方法

    这篇文章主要介绍了C#实现图片上传与浏览切换的方法,是很有实用价值的一个应用技巧,需要的朋友可以参考下
    2014-08-08
  • C#使用smtp发送带附件的邮件实现方法

    C#使用smtp发送带附件的邮件实现方法

    这篇文章主要介绍了C#使用smtp发送带附件的邮件实现方法,可直接将string类型结果保存为附件,实例中备有相应的注释便于理解,需要的朋友可以参考下
    2014-11-11
  • C#递归实现显示文件夹及所有文件并计算其大小的方法

    C#递归实现显示文件夹及所有文件并计算其大小的方法

    这篇文章主要介绍了C#递归实现显示文件夹及所有文件并计算其大小的方法,是遍历算法中比较典型的一种应用,有不错的学习借鉴价值,需要的朋友可以参考下
    2014-08-08

最新评论