2017-02-20 2 views
1

私の学習の旅では、Visual Studioがフォームのオープン、クローズ、およびディスポーザルに不満を感じるようになっていますそれと)。 私のやり方。 Visual Studioは、"using"ステートメントを使用してフォームを適切に開く、閉じる、そして廃棄する

"Form1はIDisposable型を作成します"というメッセージを表示します。

私は正しくやりたいと思っています。私はもう少し掘り下げて、 "使用する"ステートメントがどのように機能し、実装されるべきか少し分かりました。物事が適切に処理されることを保証します。 私のSQLデータベースメソッド(挿入、更新&削除)のような魅力的な働きました。ここで、SqlConnection & SqlCommandはIDisposable型を作成します。

最近のいくつかの調査によると、試して、キャッチし、最後に私は次のように同じことを達成できるはずです。フォームを使用せずにフォームを閉じることもできます。 Try、Catch、Finallyも同様です。フォームはそれを使用せずに閉じられ、Visual Studioは同じ「IDisposable Types」メッセージをスローします。

さらに言えば、私が見つけたすべての "使用している"情報の後に。私はアプリケーション(と私のコーディングスタイル)をかなり改善することができました。私はフォームの "使用"を使用する方法を理解することはできません... フォームのインスタンスを作成することができますが、私はそれを完了するか、ユーザーが "閉じる"をクリックするまでフォームを開いたままにすることはできません。 したがって、私の質問です:これを適切に実装する方法は?またはこれはまったく可能ですか?使用すると

例:

private void OpenForm1() 
{ 
    // Create a new instance of Form1 
    using (var f1 = new Form1()) 
    { 
     // Some Code Here 
    } 
    // Form1 Instance Gets Disposed at the End of the Loop Above. 
} 

私の現在の(ささやかな)オープン&フォームを閉じる方法の例:

小型注:私が制御するクラスから怒鳴るこのメソッドを呼び出しています:

  • オープン&閉じるフォーム
  • データPAS sedのフォーム

    private Form1 f1; 
    
    public void OpenForm1(bool _Open, int _LocX, int _LocY) 
    { 
        try 
        { 
         switch (_Open) 
         { 
          case true: 
    
           // Close & Dispose "Form1" (if Opened) 
           if (f1 != null) { OpenForm1(false, 0, 0); } 
    
           // Re-Open Form1 with New Data (if Closed) 
           if (f1 == null) { f1 = new Form1(_LocX, _LocY); } 
    
           f1.Show(); 
           break; 
    
          case false: 
           if (f1 != null) { f1.Close(); f1.Dispose(); f1 = null; } 
           break; 
         } 
        } 
    
        catch (InvalidOperationException _IOE) { MessageBox.Show(_IOE.Message); } 
    } 
    

注 経由: - 理論だけ今のところ、私は私が代わりにまだそれを実装する方法を理解したり、実用的な方法でそれを使用していない私をWICH(IDisposableインターパターンを作る/使用することができます知っています。私の試みはすべて失敗した。私に圧倒させ、そうするのがよいかどうか疑問に思う)。

ありがとうございます。 最高の敬具;

+2

'OpenForm'メソッドは、それが何をするのか非常に複雑です。再帰的に自分自身を働かせるという副作用に頼っています。その名前にもかかわらず、フォームを閉じる*にも使用できます。一致する 'CloseForm'メソッドを作成するだけです。そのエラーについては、特定のエラーコードは何ですか? CA1001? CA1063?または、他の何か? 'Form1'の' Dispose'メソッドで 'f1'を処分していないと不平を言っているかもしれないので、常に処分されていることを保証することはできません(あなたがいつもそうしていても)。 –

+0

Greetings Pieter;それはCA1001を表示しています。 – Richard

答えて

1

使用ブロックが有効範囲外になったときに変数の有効期間が終了する場合は、usingのみを使用します。フォームがusingステートメントの範囲外になるようにフォームを保存したいので、そこにusingブロックを使用しないでください。

Form.Closeとにかく、ここではフォームの終了によってリソースのクリーンアップが処理されるため、ここで心配する必要はありません。フォーム上でDisposeに電話する唯一の時間は、Showを決して呼び出さなかった場合です。

+1

ありがとうHoodaticus。それは少し私を啓発した。しかし、 "ID可能なタイプ"のメッセージはまだ残っています。これは、私が正しくこれをやっていないことを意味します。私はクローズまたはディスポーザルを呼び出します。 – Richard

+0

@リチャード - この警告は、IDisposableを実装していないクラスにIDisposableフィールドを持つことによって発生します。 IDisposableを実装し、あなたは良いです。何もする必要はありません。 – hoodaticus

+1

真剣に! x)まあ私は自分でC#を勉強しています。ここをあそこに掘り下げて、自分のやり方で本当に難しいコードを書こうとしています...だから私はいくつかばかな質問をすることを期待しています... ありがとうM8;それは私が良い軌道に乗っていることを意味します! あなたが書いたとおりになります。 – Richard

関連する問題