2

さて、これは私が達成しようとしていることの主な本質であり、それがしていることの症状です。

メインウィンドウフォームがあります。このフォームで、ユーザーは新しい別のフォームを開くボタンをクリックできます。このフォームには、FolderBrowserDialogを表示するためのボタンがあります。代わりに、form2をロックするだけで、何も表示されません。

これが基本的に私がフォームなどを扱っているコードです。

これは、私がいくつかの面白くないことをした後にロードされる最初の形式です。

FORM1.cs
//do stuff
//In a button.click method I do the following
Application.Run(new Form2(myParameters1, 2, 3));

これは、最初のフォームから呼び出される2番目のフォームです

FORM2.cs
//do more stuff with the parameters on load
//user clicks on a button
private void button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog fbd = new FolderBrowserDialog();
    fbd.RootFolder = Environment.SpecialFolder.Desktop;
    fbd.Description = "This is the browser dialog box";

    if(fbd.ShowDialog() == DialogResult.OK)
    {
        //do stuff
    }
}

ボタンをクリックした後、ダイアログボックスが表示されず、form2は何も実行できなくなります。

私も変更を試みました

fbd.ShowDialog() 

fbd.ShowDialog(Form2.ActiveForm)

同じ結果になります。

どんな助けでもいただければ幸いです!さらに詳しい情報が必要な場合はお知らせください。できる限りの情報を提供できるよう努めます。

編集

私は、2番目のフォームを開くメソッドが別のスレッドであることを言及するのを忘れました(そして実際には完全に忘れました)。

したがって、最初のフォームはスレッドを開始し、2番目のフォームを開きます。これは、そうではないダイアログを開くことになっています。今、私はそれが糸脱毛に関係していると思います。

4

2 に答える 2

1

私は自分の問題を理解しました。結局、Form2を開いていたForm1のスレッドは、UIスレッドから完全に分離されていたため、DialogBoxを開くことができませんでした。

私はそのスレッドを使用して回避することになり、それを完全に排除して問題を解決しました。ダイアログボックスが思い通りに開きました。

回答ありがとうございます!彼らは私が正しくやらなかった他のいくつかのことを理解するのを助けてくれました。

于 2012-06-22T14:17:33.300 に答える
1

私も同様の問題を抱えていました。メインGUIスレッドは、データベースに書き込むためのbackgroundworkerスレッドを作成していましたが、バックグラウンドスレッドが失敗した場合、例外ファイルを保存するためのカスタムコントロールダイアログを表示するために使用されました。このカスタムダイアログは正しく表示されましたが、例外ファイルを保存するためにfolderBrowserDialogを開くための[参照]ボタンは表示されませんでした。カスタムコントロールのタイトルバーに「応答なし」と表示されます。

カスタムコントロールを直接呼び出す代わりに、このようにUIスレッド自体を呼び出すようにしました。

void DBThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {                
            this.Invoke(new CrossThreadExceptionHandler(CatchInterThreadException), e.Error);                
        }
    }
于 2014-03-17T18:14:51.253 に答える