gpt4 book ai didi

C# 线程化 FolderBrowserDialog

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:01 24 4
gpt4 key购买 nike

我正在尝试使用 FolderBrowserDialog 在 C# 中选择一个文件夹。起初我得到了一个线程异常,所以我用谷歌搜索出了什么问题并修复了它,但现在我陷入了另一个问题。我想知道何时选择了文件夹。

这就是我现在得到的。

 private void btnWorkingFolder_Click(object sender, EventArgs e)
{


var t = new Thread(SelectFolder);
t.IsBackground = true;
t.SetApartmentState(ApartmentState.STA);
t.Start();

}

private void SelectFolder()
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
txtWorkFolder.Text = dialog.SelectedPath;
}
}
}

这里的问题是我无法为 txtWorkingFolder 设置文本,因为我不在同一个线程中。我不想更改 txtWorkingFolder 的线程,所以我的问题是,一旦设置了 DialogResult.OK,如何从新线程更改它的值?

编辑:

这是主要的,btnWorkingFolder 是 Form1() 的一部分:

class sample
{

static void Main(string[] args)
{

Connect2Exchange conn = new Connect2Exchange();

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new Form1());

}


}

第二次编辑:

尝试示例中的代码后出现以下异常:

System.Threading.ThreadStateException was unhandled
Message=Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process.
Source=System.Windows.Forms
StackTrace:
at System.Windows.Forms.FolderBrowserDialog.RunDialog(IntPtr hWndOwner)
at System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
at System.Windows.Forms.CommonDialog.ShowDialog()
at Mail2DB.Form1.btnWorkingFolder_Click(Object sender, EventArgs e) in C:\Users\marthin\documents\visual studio 2010\Projects\Mail2DB\Mail2DB\Form1.cs:line 44
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Mail2DB.sample.Main(String[] args) in C:\Users\marthin\documents\visual studio 2010\Projects\Mail2DB\Mail2DB\sample.cs:line 26
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

感谢您的帮助!/马丁

最佳答案

在这里使用线程非常不合适。该对话框已经完全能够在 UI 线程上运行而不会干扰其他窗口的更新。

STA 和更新文本框的麻烦只是其中的一小部分。还有一个更大的问题,对话框没有父窗口。线程上没有其他窗口可用作父窗口,只有桌面窗口是候选窗口。当用户激活另一个窗口时,问题就开始了。它可以与对话框重叠,并且用户没有好的方法可以返回到它。没有任务栏按钮。这也可能是由于在错误的时间进行空闲点击而意外发生的。用户可能永远不会看到该对话框,而没有意识到它实际上已显示。

另一个问题是该对话框不会对您的其余窗口采取模式。它们保持启用状态,允许用户操作用户界面并再次启动对话框。

让它像这样工作:

private void btnWorkingFolder_Click(object sender, EventArgs e)
{
using (var dialog = new FolderBrowserDialog()) {
if (dialog.ShowDialog() == DialogResult.OK)
{
txtWorkFolder.Text = dialog.SelectedPath;
}
}
}

如果您真的确实需要对话框独立于您的其余窗口运行,那么您需要提供一个可以充当父窗口的“宿主”窗口。这现在还需要您使用 Application.Run() 来泵送消息循环。 防止用户再次打开对话框的对策,使用 Enabled 属性。

关于C# 线程化 FolderBrowserDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com