- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 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/
每当我调用 folderbrowserdialog.showDialog() 时,我的应用程序就会崩溃。我使用的是之前对我有用的代码,所以它不能是代码。 try { FolderBrowser
我有一个 FolderBrowserDialog,显示的代码如下所示。但是,它会一直打开并选择“计算机”,即文件夹树的根目录。如何让它在选定的文件夹上打开? var folderBrow
我有以下运行良好的 PowerShell 函数,但该窗口在 PowerShell ISE 后面的后台打开。 # Shows folder browser dialog box and sets to
鉴于该对话框被称为文件夹浏览器对话框,我怀疑答案是否定的,但是有没有办法让文件夹浏览器允许路径的文本输入,而不是强制浏览?我需要从网络共享中选择一个文件夹(并且只能选择一个文件夹),对话框中的整个浏览
我有一个文件夹。该文件夹中有多个文件夹,每个文件夹中有一个图像。像这样: Main Folder>Subfolder 1>Picture 1 Main Folder>Subfolder 2>Pictu
如果对话框点击Make new folder, just start editing the name just create a folder and click OK, OK dialogreza
您好,我在 visual studio 2013 中将 FolderBrowserDialog 与 wpf 一起使用,但我想删除按钮创建新文件夹,因为在我的应用程序中它毫无意义,我看到这篇文章 htt
我正在尝试使用 FolderBrowserDialog 在 C# 中选择一个文件夹。起初我得到了一个线程异常,所以我用谷歌搜索出了什么问题并修复了它,但现在我陷入了另一个问题。我想知道何时选择了文件夹
好的,这就是我正在努力实现的主要本质以及它正在做的事情的症状。 我有一个主窗体。在此表单上,用户可以单击将打开一个新的单独表单的按钮。此窗体将有一个按钮,该按钮应该显示 FolderBrowserDi
Windows 似乎在一些地方使用了一个更现代的对话框来浏览和选择文件夹(我在网上找到了这个屏幕截图,http://media.wiley.com/Lux/97/145397.image1.jpg),
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
我在使用 FolderBrowserDialog 的 fb.SelectedPath 函数时遇到问题。一切都很好,只要绝对路径不包含任何“.”。 例如: try { if (arg == 1)
这个问题在这里已经有了答案: show text box in FolderBrowserDialog (3 个答案) 关闭 5 年前。 我不确定要在这里谷歌什么来解释我想做什么,所以我会在这里尝试
这对我来说似乎很奇怪。我正在使用 FolderBrowserDialog 选择一个文件夹,该文件夹将成为一堆文件的目的地。每当在对话框中创建并选择一个文件夹时,当我之后在资源管理器中查看该文件夹时,生
我有一个带有 FolderBrowserDialog 的 winform,可以从网络驱动器中选择一个文件夹。问题在于它返回驱动器号 (X:\Folder...) 而不是网络路径 (\\Network\
我正在使用 System.Windows.Forms.FolderBrowserDialog 让用户选择一个位置。用户可以覆盖的默认位置位于 %appdata%。 只要用户在 %appdata% 以下
FolderBrowserDialog.RootFolder Property仅限于 Environment.SpecialFolder 中定义的特殊文件夹枚举器。然而在我的应用程序中,我们需要显示这
我对对话框表单有疑问。下面是一段调用 FolderBrowserDialog 窗口的 C# 代码。现在,当我在文件夹上单击“确定”时,它将关闭对话框,因此不必太担心。但是有谁知道如何检测取消事件?我试
在 C# 应用程序中使用 FolderBrowserDialog 时,我有一个非常奇怪的行为。显示 FolderBrowserDialog 后,某些事件不会在应用程序中触发,例如 Background
我正在开发一个简单的复制工具来从数码相机中复制文件。我已经编写了文件复制代码,我已经很好地连接了所有内容。 我遇到的问题似乎与 FolderBrowserDialog 有关。在 Vista 中(我还没
我是一名优秀的程序员,十分优秀!