クライアントアプリを開発中、稀に複数のパネルやDataGridViewのスクロール位置を連動させたいケースがあります。
スクロールする挙動は、スクロールバーを移動する他に、マウスホイールの操作もあります。
今日はそんな場合の実装方法メモ。
↓のような画像をPictureBoxに設定して、パネル内に仕込みます。×2
画面イメージはこんなです↓
マウスホイール時のスクロールも確認したいので、フォーカスを受け取れるTextBoxも仕込みます。
using System.Windows.Forms;
namespace Example
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// イベントの割当
panel1.Scroll += panel1_Scroll;
panel2.Scroll += panel2_Scroll;
panel1.MouseWheel += panel1_MouseWheel;
panel2.MouseWheel += panel2_MouseWheel;
}
// Scroll, MouseWheelイベントの設定
private void panel1_Scroll(object sender, ScrollEventArgs e)
{
MoveLinkageScrollableControl(sender as Panel, panel2);
}
private void panel1_MouseWheel(object sender, MouseEventArgs e)
{
MoveLinkageScrollableControl(sender as Panel, panel2);
}
private void panel2_Scroll(object sender, ScrollEventArgs e)
{
MoveLinkageScrollableControl(sender as Panel, panel1);
}
private void panel2_MouseWheel(object sender, MouseEventArgs e)
{
MoveLinkageScrollableControl(sender as Panel, panel1);
}
/// <summary>
/// 連動するパネルのスクロール位置を設定します。
/// </summary>
/// <param name="self">イベントが発生したパネル</param>
/// <param name="linkage">もう片方のパネル</param>
private void MoveLinkageScrollableControl(Panel self, Panel linkage)
{
int x = self.HorizontalScroll.Value;
int y = self.VerticalScroll.Value;
linkage.AutoScrollPosition = new System.Drawing.Point(x, y);
}
}
}
簡単に説明すると、スクロールの移動が走ったパネルのScrollイベントとMouseWheelイベント時に、もう一方のパネルに位置を設定しているだけです。
ScrollableControl.MouseWheelイベントは、デザイナでは表示されないので注意してください。
実行してみます。
これで連動できました。
ニッチな要求かもしれませんが、参考までに。