PDA

View Full Version : ایرادی عجیب در استفاده از FolderBrowserDialog



andaron
چهارشنبه 18 مرداد 1391, 17:43 عصر
با سلام دوستان وقتی می خوام از FolderBrowserDialog استفاده کنم و وقتی متد ShowDialog رو صدا می زنم با این ارور مواجعه می شوم



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.

اینم بگم توپروژه اصلی چنین اتفاقی می افته وقتی یه پروژه جدید درست می کنم به راحتی می تونم از FolderBrowserDialog
حالا به نظرتون مشکل از چیه ؟
خیلی ضروری نیاز دارم ...
اگر نتونم از این مورد استفاده کنم به نظرتون برای بدست آوردن آدرس پوشه باید از چی استفاده کنم

cpppro
پنج شنبه 19 مرداد 1391, 15:58 عصر
سلام
احیانا از ترد تو پروژه استفاده نکردین که ؟
میشه کد مربوطه رو هم قرار بدین ؟

mehdi.mousavi
پنج شنبه 19 مرداد 1391, 16:11 عصر
با سلام دوستان وقتی می خوام از FolderBrowserDialog استفاده کنم و وقتی متد ShowDialog رو صدا می زنم با این ارور مواجعه می شوم اینم بگم توپروژه اصلی چنین اتفاقی می افته وقتی یه پروژه جدید درست می کنم به راحتی می تونم از FolderBrowserDialog حالا به نظرتون مشکل از چیه ؟ خیلی ضروری نیاز دارم ... اگر نتونم از این مورد استفاده کنم به نظرتون برای بدست آوردن آدرس پوشه باید از چی استفاده کنم

سلام.
ایراد کاملا روشن و واضح در پیامی که قرار داده اید، بیان شده. Thread جاری (که در اون از FolderBrowserDialog استفاده می کنید)، MTA مارک شده در حالیکه Component مورد نظر انتظار داره تا Apartment Model روی STA ست شده باشه. برای رفع مشکل چند روش وجود داره که خوشبختانه در این آدرس (http://stackoverflow.com/questions/6860153/exception-when-using-folderbrowserdialog) به اونها اشاره شده.

موفق باشید.

tooraj_azizi_1035
پنج شنبه 19 مرداد 1391, 16:11 عصر
آیا قبل از main برنامه [STAThread] وجود داره؟

اگه با اون مشکل حل نشد این راه حله:


using System; using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.Windows.Forms;

namespaceWindowsFormsApplication1
{
[RunInstaller(true)]
public partial class Installer1 : Installer
{
publicInstaller1()
{
MessageBox.Show("Cannot Locate Config File");
MessageBox.Show("Pid : " + System.Diagnostics.Process.GetCurrentProcess().Id. ToString());
String Location = String.Empty;
OpenFileDialog frm = new OpenFileDialog();
frm.InitializeLifetimeService();
frm.Filter = "Config Files (*.config)|*.config| (*.xml)|*.xml";
frm.Title = "Browse Config file";
DialogResultret = STAShowDialog(frm);

if (ret == DialogResult.OK)
Location = frm.FileName;

MessageBox.Show(Location);

InitializeComponent();
}

/* STAShowDialog takes a FileDialog and shows it on a background STA thread and returns the results.
* Usage:
* OpenFileDialog d = new OpenFileDialog();
* DialogResult ret = STAShowDialog(d);
* if (ret == DialogResult.OK)
* MessageBox.Show(d.FileName);
*/
private DialogResult STAShowDialog(FileDialogdialog)
{
DialogState state = new DialogState();
state.dialog = dialog;
System.Threading.Thread t = new System.Threading.Thread(state.ThreadProcShowDialog );
t.SetApartmentState(System.Threading.ApartmentStat e.STA);
t.Start();
t.Join();
returnstate.result;
}
}

/* Helper class to hold state and return value in order to call FileDialog.ShowDialog on a background thread.
* Usage:
* DialogState state = new DialogState();
* state.dialog = // <any class that derives from FileDialog>
* System.Threading.Thread t = new System.Threading.Thread(state.ThreadProcShowDialog );
* t.SetApartmentState(System.Threading.ApartmentStat e.STA);
* t.Start();
* t.Join();
* return state.result;
*/
public class DialogState
{
public DialogResultresult;
public FileDialogdialog;

public voidThreadProcShowDialog()
{
result = dialog.ShowDialog();
}
}
}

andaron
پنج شنبه 19 مرداد 1391, 19:49 عصر
سلام.
ایراد کاملا روشن و واضح در پیامی که قرار داده اید، بیان شده. Thread جاری (که در اون از FolderBrowserDialog استفاده می کنید)، MTA مارک شده در حالیکه Component مورد نظر انتظار داره تا Apartment Model روی STA ست شده باشه. برای رفع مشکل چند روش وجود داره که خوشبختانه در این آدرس (http://stackoverflow.com/questions/6860153/exception-when-using-folderbrowserdialog) به اونها اشاره شده.

موفق باشید.
ممنون از پاسختون
مشکلم حل شد
کهمن از این کد استفاده کردم

string selectedPath;
var t = new Thread((ThreadStart)(() => {
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.RootFolder = System.Environment.SpecialFolder.MyComputer;
fbd.ShowNewFolderButton = true;
if (fbd.ShowDialog() == DialogResult.Cancel)
return;

selectedPath = fbd.SelectedPath;
}));

t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();



حالا سوال اینه که چرا همچین مشکلی به وجود اومد و اینکه اصالا کد مالا که مشکل من رو حل کرد چیه یعنی چه کاری انجام میده