欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-11 13:16:04
本文实例分析了win7中c#的winform编程使用savefiledialog不能弹出保存窗体的解决方法。分享给大家供大家参考。具体分析如下: 复制代码 代码如下:pu...

本文实例分析了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#程序设计有所帮助。