源代码如下:
1 FolderBrowserDialog folderBrowserDialog; 2 OpenFileDialog openFileDialog; 3 private DialogResult dialogResult; 4 private Thread invokeThread; 5 private void invokeMethod() 6 { 7 dialogResult = folderBrowserDialog.ShowDialog(); 8 } 9 private void invokeMethod1() 10 { 11 dialogResult = openFileDialog.ShowDialog(); 12 } 13 14 /// <summary> 15 /// 浏览选择文件夹 16 /// </summary> 17 /// <param name="sender"></param> 18 /// <param name="e"></param> 19 protected void Button2_Click(object sender, EventArgs e) 20 { 21 string filePath = ""; //选择文件夹的路径及文件夹名 22 folderBrowserDialog = new FolderBrowserDialog(); 23 folderBrowserDialog.Description = "选择文件夹"; //显示说明文本 24 25 invokeThread = new Thread(new ThreadStart(invokeMethod)); 26 invokeThread.SetApartmentState(ApartmentState.STA); 27 invokeThread.Start(); 28 invokeThread.Join(); 29 30 if (dialogResult == DialogResult.OK) 31 { 32 filePath = folderBrowserDialog.SelectedPath.ToString().Trim(); 33
34 } 35 } 36 /// <summary> 37 /// 浏览选择文件 38 /// </summary> 39 /// <param name="sender"></param> 40 /// <param name="e"></param> 41 protected void Button3_Click1(object sender, EventArgs e) 42 { 43 string filePath = ""; //选择文件夹的路径及文件夹名 44 openFileDialog = new OpenFileDialog(); 45 openFileDialog.Title = "选择文件"; //显示说明文本 46 openFileDialog.Filter = "(img文件)*.img|*.img|(tif文件)*.tif|*.tif"; 47 48 invokeThread = new Thread(new ThreadStart(invokeMethod1)); 49 invokeThread.SetApartmentState(ApartmentState.STA); 50 invokeThread.Start(); 51 invokeThread.Join(); 52 53 if (dialogResult == DialogResult.OK) 54 { 55 filePath = openFileDialog.FileName.ToString().Trim(); 56
57 } 58 }
如果不用线程的方法,直接调用ShowDialog时,即如下代码:
1 protected void Button3_Click1(object sender, EventArgs e) 2 { 3 string filePath = ""; //选择文件夹的路径及文件夹名 4 openFileDialog = new OpenFileDialog(); 5 openFileDialog.Title = "选择文件"; //显示说明文本 6 openFileDialog.Filter = "(img文件)*.img|*.img|(tif文件)*.tif|*.tif"; 7 8 if (openFileDialog.ShowDialog() == DialogResult.OK) 9 { 10 filePath = openFileDialog.FileName.ToString().Trim(); 11
12 } 13 }
就会提示如下错误:
所以采用了线程的方法,但是测试发现:
点击浏览文件夹或者浏览文件的按钮后,点击浏览文件的按钮还好,大部分的时候浏览文件对话框会在浏览器的前面显示,但是浏览文件夹对话框就不行了,总是显示在浏览器的后面,无法在浏览器前面显示,请教高手,如何激活浏览文件夹对话框使其在浏览器前面显示?
因为你跨线程访问 FolderBrowserDialog 控件了。我看你invokeMethod()方法没做什么耗时的操作,需要新建线程调用吗?
如果你实在要这样做的话,你就像这样:
private void invokeMethod() { if(this.isRequired) { this.invoke(()=>{dialogResult = folderBrowserDialog.ShowDialog();}) } else { dialogResult = folderBrowserDialog.ShowDialog(); } }
您好,感谢您的回答,但是按照您的方法测试了一下,没有成功,错误提示:
然后我又把问题修改了一下,请大侠过目,小弟初学ASP.NET,还请大侠多多指教··
@zhzhx0318:
奥,我回答的是Winform下这样处理。。。。ASP.NET处于安全考虑不支持这些对话框吧,你可以使用那个js看看:http://blog.csdn.net/huangwenhua5000/article/details/8233480
或者asp.net 的控件FileUpload
加上STAThreadAttribute标记看看