win7中C#的winForm编程使用savefiledialog不能弹出保存窗体的解决方法
本文实例分析了win7中C#的winForm编程使用savefiledialog不能弹出保存窗体的解决方法。分享给大家供大家参考。具体分析如下:
publicvoidResMsg()
{
while(isRecMsg)
{
//准备一个数组准备接收服务端发来的数据
byte[]msgRec=newbyte[1024*1024*2];
//接收服务端发来的数据,此方法也会阻断当前线程,并返回接收的数据的长度
intrecLength=sokClient.Receive(msgRec);
switch(msgRec[0])
{
case1://接收到文件
DialogResultreuslt=newSaveFileDialog().ShowDialog(); ---此处有问题
if(reuslt==System.Windows.Forms.DialogResult.OK)
{
using(FileStreamfs=newFileStream(saveFileDialog1.FileName,FileMode.Create))
{
fs.Write(msgRec,1,recLength-1);
}
ShowMsg("文件保存完毕!"+saveFileDialog1.FileName);
}
break;
case2://接收到字符串消息
{
//将数据转成字符串(要转换的数组,开始转换的下标,要转换的数据长度)
stringstrRec=System.Text.Encoding.Default.GetString(msgRec,1,recLength-1);
//将接收到的数据显示在文本框中
ShowMsg(strRec);
break;
}
case3://接收到闪屏命令
{
ShakeWindow();
break;
}
}
}
}
客户端和服务器传输文件时,服务器端都显示发送成功了,但是到客户端保存时,savefiledialog保存对话框就是弹不来?!!
仔细的检查代码好几遍,逻辑上没有错误。就是弹不出来,很无语了。就上网查了,查了很多资料,没有什么头绪。在查的过程中,我看见这样的一句话“你前面都说了,你使用线程调用,那么这个线程是否为主线程?如果不是主线程,那么你应该把它交给主线程去处理”,然后我就用一个例子模拟了一下,确实有关系。
模拟的例子:
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}
privatevoidbutton1_Click(objectsender,EventArgse) { Threadt=newThread(saveDialog); t.IsBackground=true; //t.ApartmentState=ApartmentState.STA;//缺少这句话,就会出错误。
//不过以上这句在Vs2010中显示是被微软否决的,过时的,虽然还能用。但是为了更好的兼容版本,微软推出以下方法:
t.SetApartmentState(ApartmentState.STA);//即是在线程启动时设置它的单元状态,这里设置它的状态为单线程单元
t.Start(); }
publicvoidsaveDialog() { SaveFileDialogresult=newSaveFileDialog(); result.ShowDialog(); } }