イベントが割り当てられた一連のコントロールを動的に作成する GUI を作成します。実行時にこれらのコントロールを追加および削除する必要があります。次のようになります。
FlowLayoutPanel.Controls.Clear();
<< add new controls, assigning Click events with += >>
+= を使用してイベント ハンドラーを割り当てると、メモリ リークが発生する可能性があると聞きました (具体的には、アプリケーションが終了するまでメモリは解放されません)。これは避けたい。私はここのようないくつかの関数を書くことができることを知っています コントロールからすべてのイベントハンドラーを削除してすべてのイベントハンドラーを見つけてそれらを削除する方法は非常に複雑に見えます。
別の方法はありますか?Dispose を呼び出すと、これらのイベント ハンドラーを削除できますか? C/C++ のように、オブジェクトを破棄してメモリを強制的に解放できますか?
ありがとう!
PS: 問題は、デタッチするイベントがわからないことです。たくさんのラベルを作成し、さまざまな種類の onclick イベントをそれらに追加します。フロー レイアウト パネルをクリーンアップするとき、どのイベント ハンドラーがどのラベルにアタッチされているかを知る方法はありません。
これはサンプル コードです (_flowLP は FlowLayoutPanel です)。この Refresh() 関数は、アプリケーションが終了する前に複数回実行されます。
private void Refresh()
{
Label l;
Random rnd = new Random();
// What code should i add here to prevent memory leaks
_flowLP.Controls.Clear();
l = new Label();
l.Text = "1";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "2";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "3";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "4";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "5";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "6";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
}