System.Windows.Forms.Panel クラスや System.Windows.Forms.UserControl クラスなどにある (大元は System.Windows.Forms.ScrollableControl クラス) AutoScroll プロパティに頼りすぎてハマりました。
現在とデータベースのマスタ メンテナンスを C#2.0 でダラダラとやっています。いくつかのテーブルは 1 つの項目が表形式になっています。表形式といっても単純な表ではないため、Grid 系のコントロールを使用することはできません。そこで 1 行を複合コントロール (カスタム コントロール) で表してそれを縦に並べる仕様にしました。ユーザーは自由に行の挿入と削除ができるようになっています。
私は面倒くさがり屋なので指定された型 (複合コントロール) を Repeat して勝手に表形式にしてしまう RepeatPanel なるものを拡張コントロールとして作成しました。仮想スクロールではないため、コンテナに対して 1 行を表す複合コントロールを動的に配置します。Panel の表示エリアからはみ出たものは、AutoScroll プロパティによって見えない位置に勝手に配置されると考えたのです。
確かに数行はこれで問題なく配置されているようでしたが、途中からものすごい勢いで縦位置がずれてしまいました。コンテナに複合コントロールを追加する直前に AutoScroll プロパティを false にするとこの現象は再現しません。どうやら、AutoScroll 機能が悪さをしているようです。AutoScroll プロパティを一旦 false にするとスクロール バーがチラつきますので、AutoScrollMinSize プロパティでサイズを伸ばしてからコンテナにコントロールを追加するように実装しました。こんな実装ごときに小 1 時間ハマってしまうとは深く反省しています。とはいえ、AutoScroll プロパティのせいで挙動が変わるのはちょっと親切でないと思います。
ちなみにこの RepeatPanel コントロール、読んでのごとく物理的に複合コントロールを配置しています。そのため行数が増えると少々重くなりますが、それほど気にはなりません。もちろん、仮想スクロールにしたりカスタム ドローも検討したのですが、エラー検証 (ErrorProvider の扱い) が面倒になるので工数の兼ね合いから断念しました。