じゃんぬねっと日誌

ネタと雑記と時々プログラミング

目次

Blog 利用状況

ニュース

ニセくさい(笑) サイトです。

スポンサードリンク

運営サイト

  • C# と VB.NET の入門サイト

Blog Item

フィードメーター - じゃんぬねっと日誌

書庫

AutoScroll プロパティに頼りすぎてハマりました

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 の扱い) が面倒になるので工数の兼ね合いから断念しました。

投稿日時 : 2007年6月28日 10:54

コメントを追加

# 私もハマりました 2007/06/29 7:47 ラフィン

あ、それ私もハマりました。

行・列のタイトル固定でマウスであれこれ操作できるガントチャートの設計をした時です。「言う事聞けよ、テメー」と声が出てしまったかも(笑)

コントロールが1万とかになるとさすがに重かったので断念しましたけど。

# re: AutoScroll プロパティに頼りすぎてハマりました 2007/06/29 7:56 じゃんぬねっと

おお、ラフィンさんもですか! AutoScroll のつまみサイズに反比例してズレが大きくなっていくので、本当に「言うコト聞けよ、てめぇ」って感じになりました。

タイトル  
名前  
URL
コメント