2010-12-14 15 views
1

スクロール可能なパネルと2つのコントロールが重ねて表示されているフォームがあります。そのフォームがアクティブになっている特定の条件に基づいて、私は2つのコントロールの可視プロパティを入れ替えるかもしれません。これらのコントロールは、スクロール可能なパネルの下部にあります。私がフォームを下にスクロールしたままにしておくと、コントロールの視認性をスワップさせ、そのフォームに戻って表示コントロールが200pxほど下がって大きなギャップを残すようになる条件を変更します。誰がこれを引き起こしているのか知っていますか?私は、フォームの上にスクロールバーの位置をリセットしようとしましたが、それはちょうど小さなギャップを引き起こし、時にはコントロールが他のコントロールに移動することがあります。何か案は?スクロールバーの位置が移動している可視/非表示の変更コントロール

+1

plz画像を追加すると分かりやすくなります。 –

答えて

0

いいえrepro。 Visibleプロパティを変更する以上のことをしていると聞こえます。 Locationプロパティを割り当てるたびに、AutoScrollPositionを追加してスクロール状態を補正する必要があります。これが役に立たない場合は、コードを投稿してください。

+0

それは本当に私がやっている唯一のことです。あるコントロールで可視性を無効にし、別のコントロールで可視化を無効にするコードをコメントアウトして、両方を表示したままにしておくと、フォームのスクロール位置から離れても同じ位置にとどまりません。 AutoScrollPositionを使って遊んでいきますが、何か作業ができないかどうかを確認します。また、コントロールのプロパティには、プログラムではなく、場所が設定されています。 – novacara

+0

私はこれを最善の答えとしてマークするつもりです。フォームを終了するたびにpanel.AutoScrollPositionを(0,0)に設定しなければなりませんでした。なぜなら、これはフォームがスクロールダウンして終了したときにのみ発生したからです。私は以前これを試していたと思いますが、パネルではなくフォーム上でAutoScrollPositionを設定していたので、もちろん動作しませんでした。私は可視性を混乱させていない場合でもそれがどちらの方法でもうまく動作して以来何が起こっているのかまだ分かりませんが...ああ! – novacara

1

これは、問題を再現する例です。マウスを赤いラベルの上に移動すると、button2の表示がtrueに変更され、スクロールがButton1に戻るようにジャンプします。それを修正する

public class Form123456 : Form { 

    public Form123456() { 
     Controls.Add(new UC1()); 
    } 

    public class UC1 : UserControl { 
     Button b1 = new Button { Text = "Button1" }; 
     Label lb = new Label { Text = "_", AutoSize = true, BackColor = Color.Red }; 
     Button b2 = new Button { Text = "Button2", Visible = false }; 
     Button b2b = new Button { Text = "x" }; 
     Button b3 = new Button { Text = "Button3" }; 
     public UC1() { 
      AutoScroll = true; 
      Dock = DockStyle.Fill; 
      b1.Location = new Point(0, 200); 
      b2.Location = new Point(0, 600); 
      lb.Location = new Point(70, 600); 
      b2b.Location = new Point(90, 600); 
      b3.Location = new Point(0, 800); 
      Controls.Add(b1); 
      Controls.Add(b2); 
      Controls.Add(lb); 
      Controls.Add(b2b); 
      Controls.Add(b3); 

      lb.MouseEnter += delegate { 
       b2.Visible = true; 
      }; 
      lb.MouseLeave += delegate { 
       b2.Visible = false; 
      }; 
     } 
    } 
} 

、一つの解決策は、このコードを追加することです:

protected override Point ScrollToControl(Control activeControl) { 
     return this.AutoScrollPosition; 
    } 

ソリューションから: Why does clicking in a text box cause an AutoScroll panel to scroll back to the top?

0

はあなたが2つのコントロールの可視性を変更することを順番に確認したことがありますか? オートスクロールがtrueに設定されているコンテナのスクロールバーは、コントロールの可視領域外にあるコントロールの位置に応じて表示され消えます。見えないコントロールはカウントされません。 したがって、両方のコントロールをいつでも非表示にすると、スクロールバーが消えます。一つのコントロールが見えるようになると、彼らは戻ってくるでしょう。したがって、スクロールバーの位置とコントロールの位置にジャンプがないことを確認するには、両方のコントロールが同時に表示されないようにする必要があります。もう1つの解決策は、コンテナに疑似可視コントロールを持たせることです。これは、可視性がtrueに設定されているコントロールですが、実際には表示されません(たとえば、背景の色の点、テキストのないラベル...)。このコントロールを最も遠い位置x、yに置くと、スクロールバーが消えません。

関連する問題