DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ユーザコントロールの自動スクロールのバグ?

環境/言語:[VisualStudio.NET2003 C#]
分類:[.NET]

こんにちは。
度々お世話になります。

現在、ユーザコントロールにて、
あるユーザーコントロール(Aと仮定します。)をリスト状に配置して
表示するユーザーコントロール(Bと仮定します)を作成しています。

リスト状に格納されるユーザコントロール(A)は、
チェックボックスとピクチャーボックスとテキストボックスとPanelを組み合わせたユーザーコントロールです。

このユーザコントロール(A)をリスト状に表示するユーザコントロール(B)に追加します。
このユーザコントロール(B)は、Panelのみが配置された単純なコントロールで、
Panelの自動スクロールを「True」に設定して有効にしています。

格納されるユーザコントロール(A)がユーザコントロール(B)のPanelの範囲外に配置された場合に、
スクロールバーが自動的に表示されます。

ここまでは問題ないのですが、問題は、ユーザコントロール(A)が追加されるときに
この自動スクロールの位置「this.panel.AutoScrollPosition」が、自動的に

X=0,Y=-14

となってしまうことです。
ソースで、ユーザコントロール(A)の追加後に自動スクロールの位置の値を直接変更しても、
デバッガで見ている上では直接設定された値になったままですが、全てのイベントが処理されイベント待ちの状態になりデバッガを離れた後、

X=0,Y=-14

の値が設定されて自動スクロールの位置が毎回その位置に移動してしまいます。

このような症状を回避するための方法は何か無いでしょうか?

よろしくお願いいたします。
■No6710に返信(DirectGLさんの記事)
DirectGLさん初めまして 平ちゃんです。
私は初心者なので見当違いの回答でしたら、すみません。
フォームのスクロールバーはフォーカスのあるコントロールを表示するように
自動的にスクロールをします。
パネルでは確認していませんがパネルも同様と考えると
パネル上のコントロールのフォーカスの影響では?
2004/10/15(Fri) 18:47:55 編集(投稿者)

■No6710に返信(DirectGLさんの記事)
> このユーザコントロール(B)は、Panelのみが配置された単純なコントロールで、
> Panelの自動スクロールを「True」に設定して有効にしています。

それだったら、なぜ素直に Panelコントロールを使わないのでしょうか?
何か理由があるのでしょうか?

> 格納されるユーザコントロール(A)がユーザコントロール(B)のPanelの範囲外に配置された場合に、
> スクロールバーが自動的に表示されます。
> ここまでは問題ないのですが、問題は、ユーザコントロール(A)が追加されるときに
> この自動スクロールの位置「this.panel.AutoScrollPosition」が、自動的に
> X=0,Y=-14
> となってしまうことです。

私も試したんですが、そうはなりませんでした。
Point(0, 0)のままでした。

> ソースで、ユーザコントロール(A)の追加後に自動スクロールの位置の値を直接変更しても、
> デバッガで見ている上では直接設定された値になったままですが、全てのイベントが処理されイベント待ちの状態になりデバッガを離れた後、
>
> X=0,Y=-14
>
> の値が設定されて自動スクロールの位置が毎回その位置に移動してしまいます。
>
> このような症状を回避するための方法は何か無いでしょうか?

ソースもなく情報が少ないので何とも言えませんが、
まあ、ParentたるコントロールB.Panel.AutoScrollPositionではなく、
子供側のコントロールAのLocationを動かしてみましょう。

■追記

> このユーザコントロール(B)は、Panelのみが配置された単純なコントロールで、
> Panelの自動スクロールを「True」に設定して有効にしています。

 ちょっと気になったのが、ユーザコントロールに対してそのPanelが初期値として、
 同じ大きさのSizeで、Anchorが「Top, Bottom, Left, Right」になっているのかどうかですね。
 まあ、素直に Panelコントロールを使えば関係ない話ですが。
ご返信ありがとうございます。


■No6710に返信(DirectGLさんの記事)
> DirectGLさん初めまして 平ちゃんです。
> 私は初心者なので見当違いの回答でしたら、すみません。

初めまして。平ちゃんさん。
私もコントロールのプログラムとなると初心者に近い部分があります。


> フォームのスクロールバーはフォーカスのあるコントロールを表示するように
> 自動的にスクロールをします。
> パネルでは確認していませんがパネルも同様と考えると
> パネル上のコントロールのフォーカスの影響では?


そして、まさにご指摘の通りでした。

一番最初に追加されたコントロールにフォーカスは移っていましたが、
リスト内のコントロールをクリックにした時に、コントロールを有効にして選択状態に見せるために変更していたのですが、
選択したコントロールにフォーカスを移すことを、すっかり忘れていました。

単純なミスでお恥ずかしい限りです。
無事に解決いたしました。


■No6729に返信(java.lang.Nullpoさんの記事)
> 2004/10/15(Fri) 18:47:55 編集(投稿者)
>

初めまして。
Java.lang.Nullpoさん。

> ■No6710に返信(DirectGLさんの記事)
>>このユーザコントロール(B)は、Panelのみが配置された単純なコントロールで、
>>Panelの自動スクロールを「True」に設定して有効にしています。
>
> それだったら、なぜ素直に Panelコントロールを使わないのでしょうか?
> 何か理由があるのでしょうか?
>

自作となるとユーザコントロールばかりに目がいってしまった部分もありますが、当初は「Panel」以外にもコントロールを複合させる予定でした。

なので、今ではPanelを継承したほうが筋が通っている状態です。

> 私も試したんですが、そうはなりませんでした。
> Point(0, 0)のままでした。
>
>>ソースで、ユーザコントロール(A)の追加後に自動スクロールの位置の値を直接変更しても、
>>デバッガで見ている上では直接設定された値になったままですが、全てのイベントが処理されイベント待ちの状態になりデバッガを離れた後、
>>
>> X=0,Y=-14
>>
>>の値が設定されて自動スクロールの位置が毎回その位置に移動してしまいます。
>>
>>このような症状を回避するための方法は何か無いでしょうか?
>
> ソースもなく情報が少ないので何とも言えませんが、
> まあ、ParentたるコントロールB.Panel.AutoScrollPositionではなく、
> 子供側のコントロールAのLocationを動かしてみましょう。
>
> ■追記
>
>>このユーザコントロール(B)は、Panelのみが配置された単純なコントロールで、
>>Panelの自動スクロールを「True」に設定して有効にしています。
>
>  ちょっと気になったのが、ユーザコントロールに対してそのPanelが初期値として、
>  同じ大きさのSizeで、Anchorが「Top, Bottom, Left, Right」になっているのかどうかですね。
>  まあ、素直に Panelコントロールを使えば関係ない話ですが。


単純な問題だったのですが、検証までしていただいて申し訳ありませんでした。

ただ、Anchorを「Top, Bottom, Left, Right」にするのと、
Dockを「Fill」に設定すること(コントロールの配置場所とサイズが同じ場合)に
違いがあったりするのかなと、ふと思いました。


平ちゃんさん。
java.lang.Nullpoさん。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板