ヘッダーをグループ化した UltraGrid で、横スクロール時に特定の列を固定し、常に表示したい場合があります。
例えばこのようなレイアウトのグリッドで、col1 から col3 までを固定し、col4 以降の列のみを横スクロールさせたいとします。

この例では col2 と col3、col4 と col5 ヘッダーがグループ化されていますが、このように UltraGrid の行レイアウト機能を使用した場合は列固定機能を併用することができません。
行レイアウトモードを使用したグリッドで横スクロールを行うには、列のスクロール領域を左右に分割し、片方のみをスクロール表示させる方法があります。

以下のように列のスクロール領域を二つに分け、左側の領域のスクロールバーを非表示、幅の変更を禁止した上で、右側の領域に対して ScrollGroupIntoView() メソッドを実行してプログラムによってスクロールを行います。

ultraGrid1.DisplayLayout.MaxColScrollRegions = 2;
ultraGrid1.DisplayLayout.ColScrollRegions[0].Split();
ultraGrid1.DisplayLayout.ColScrollRegions[0].Width = 315;
ultraGrid1.DisplayLayout.ColScrollRegions[0].Scrollbar = Scrollbar.Hide;
ultraGrid1.DisplayLayout.ColScrollRegions[0].SizingMode = SizingMode.Fixed;
ultraGrid1.DisplayLayout.ColScrollRegions[1].ScrollGroupIntoView(ultraGrid1.DisplayLayout.Bands[0].Groups[1], true);

また、UltraGrid の BeforeColRegionScroll イベントをハンドルし、左側の領域でスクロールが発生した場合、および、右側の領域のスクロール時にcol1からcol3までが表示領域に入った場合はイベントをキャンセルします。

private void ultraGrid1_BeforeColRegionScroll(object sender, BeforeColRegionScrollEventArgs e)
{
	var header = e.NewState.VisibleHeaders.ColScrollRegion.VisibleHeaders[0].Header.Column.Key;
	if (e.NewState.IsFirstVisibleRegion)
	{
		e.Cancel = true;
	}
	else if (header == "col1" || header == "col2" || header == "col3")
	{
		e.Cancel = true;
		ultraGrid1.DisplayLayout.ColScrollRegions[1].ScrollGroupIntoView(ultraGrid1.DisplayLayout.Bands[0].Groups[1], true);
	}
}
Tagged:

製品について

Ultimate UI for Windows Forms