1

背景: この UserControl を作成しました。ユーザー コントロールのコンストラクターで、データベースからいくつかの値を取得する関数を呼び出します。値の取得中にエラーが発生した場合は、エラーを説明するメッセージ ボックスが表示されます。ここまでは順調ですね。

問題: (他の要素の中でも) UserControl を含むフォームを作成しました。このフォーム (または UserControl 自体) を開くと、コンストラクターが呼び出され (正確に描画できると思います)、データベースが使用できないため、メッセージボックス (上記で説明) が表示されます。

これを防ぐにはどうすればよいですか?

はっきりさせておきたいのですが、コードは実行時にうまく機能します。すべてが設計どおりです。問題が発生するのは、Visual Studio (重要な場合は 2008 SP1) のデザイナー ビューのみです。ただし、デザイナでは、特に接続が失敗したときにアプリケーションが再接続を試みると、ひどいものになります。デザイナー モードに入るたびに、Visual Studio が約 20 秒間フリーズし (再接続のタイムアウト)、作業プロセスが強制終了されます。

4

2 に答える 2

4

コントロールがデザイン モードで表示されているかどうかを確認できます。

http://msdn.microsoft.com/en-us/library/system.componentmodel.component.designmode.aspx

/編集: 別の回答へのコメントで人々が指摘したように、DesignMode プロパティはコンストラクターでは使用できません。したがって、おそらく最善の解決策は、データベースのものを「Load」などのイベントに移動し、そこで DesignMode プロパティを使用することです。

于 2009-10-14T15:30:01.513 に答える
3

これを回避するには、IsRunning という Program クラスにグローバルな静的プロパティを設定します。

メイン メソッドでプログラムを起動するときに、IsRunning プロパティを true に設定します。次に、ユーザーコントロールのコンストラクターで IsRunning プロパティをポーリングして、特定のコードを実行するかどうかを判断できます。この場合、データベースにアクセスしようとするコードです...

編集:ここにいくつかのコードがあります...

private static bool _running = false;

    /// <summary>
    /// Gets or sets a value indicating whether this <see cref="Program"/> is running.
    /// This property is used for design time WSOD issues and is used instead of the 
    /// DesignMode property of a control as the DesignMode property has been said to be
    /// unreliable.
    /// </summary>
    /// <value><c>true</c> if running; otherwise, <c>false</c>.</value>
    public static bool Running
    {
        get
        {
            return _running;
        }
    }


    static void Main(string[] args)
    {
        Initialize();


        _running = true;

....

私のユーザーコントロールでは...

    public AssignmentList()
    {
        InitializeComponent();

        if (!Program.Running)
        {
            return;
        }
于 2009-10-14T15:29:44.993 に答える