ControlHelper.SuspendDrawing(panel);
panel.Controls.Clear();
AddItemIdLabel();
AddLastEditedLabel();
AddDeleteButton();
AddSaveButton();
ControlHelper.ResumeDrawing(panel);
public static class ControlHelper
{
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private const int WM_SETREDRAW = 0xB;
public static void SuspendDrawing(Control target)
{
SendMessage(target.Handle, WM_SETREDRAW, 0, 0);
}
public static void ResumeDrawing(Control target)
{
SendMessage(target.Handle, WM_SETREDRAW, 1, 0);
target.Refresh();
}
}
上記のコードでテストすると、パネルの一部が更新されません。新しいコントロールが追加されていない場所では、Clear() の前の古いコントロールを見ることができます。
panel.Controls.Clear();
を前に置くと、ControlHelper.SuspendDrawing(panel);
すべてが意図したとおりに機能しますが、回避しようとしているちらつきが見えます。
それで、ここで何が起こっているのですか?サスペンドの前または後にコントロールのコレクションをクリアするかどうかによって、どのように違いがありますか?