Half-Retirean's Lazy Life Diary / ダラダラ余生日記

最近思ったこと: やりたいことだけやるって幸せなことだ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  984  : 記事  4  : コメント  42107  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

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

最近のできごと

暇人28号FX

Sponsored Link1

Sponsored Link2

Archive

書庫

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 のつまみサイズに反比例してズレが大きくなっていくので、本当に「言うコト聞けよ、てめぇ」って感じになりました。

Post Feedback

タイトル
名前
Url:
コメント: