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

DataGridで列を固定

分類:[.NET]

Windowsで、DataGridを使用する際に、左側の列を固定表示させたいのですが、
どうもDataGrid自体にはそのような機能は無いようです。
二つのDataGridを使用して、縦スクロールを同期させるのが一般的な方法と
いうところまでは調べがついたのですが、具体的な方法が分かりません。

とっかかりでも結構ですので、ご教授頂けないでしょうか?
よろしくお願い致します。
お世話になります。

■No13531に返信(いわしさんの記事)
DataGrid.Scrollイベント
で左右のスクロールの同期をとるとか。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsdatagridclassscrolltopic.asp

もしくはDataGridを継承して
DataGrid.OnScrollをオーバーライドして何かをするとか。…でしょうか。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsdatagridclassonscrolltopic.asp

> Windowsで、DataGridを使用する際に、左側の列を固定表示させたいのですが、
> どうもDataGrid自体にはそのような機能は無いようです。
> 二つのDataGridを使用して、縦スクロールを同期させるのが一般的な方法と
> いうところまでは調べがついたのですが、具体的な方法が分かりません。
>
> とっかかりでも結構ですので、ご教授頂けないでしょうか?
> よろしくお願い致します。
>
  • 題名: Re[2]: DataGridで列を固定
  • 著者: trapemiya
  • 日時: 2005/10/31 2:30:37
  • ID: 13550
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
DataGridから派生させた2つのクラスを用意します。それぞれ、myDataGrid1とmyDataGrid2とします。myDataGrid1のScrollイベントで自分のvScrollbar.Valueを取得し、この値で、myDataGrid2のGridVScrolledを呼んであげれば、myDataGrid1のスクロールに合わせてmyDataGrid2がスクロールするはずです。
myDataGrid1の行セレクタによる行の選択はCurrencyManagerによって同期が取られますので、結果的にスクロールが同期するでしょう。
ただ、マウスのホイールを使った場合は、Scrollイベントが発生しなかったと思いますので、ここも対応する必要があります。
過去ログに多数あります。

DataGridの同期
http://dobon.net/vb/bbs/log3-7/3992.html

複数データグリッドでのスクロールの同期について
http://dobon.net/vb/bbs/log3-8/4873.html

スクロールの同期、または抑止
http://dobon.net/vb/bbs/log3-7/4150.html
■No13551に返信(管理人さんの記事)
> 過去ログに多数あります。

探し方が甘かったようで、申し訳ありませんでした。
時間がとれなくて検証できませんが、検証が終わったら、また書き込みさせて
頂きます。

たくさんのレスに感謝です。
解決済み!
過去レスのコード(VB)を参考にCSに書き換えました。
.netのイベント関係が理解できておらず、稚拙なコードなのかもしれませんが、
今後の参考にして頂けたら幸いです。
また、稚拙な部分にツッコミ頂くと喜びます。

//DataGridのサブクラス
using System.Windows.Forms;

public class MyDataGrid : System.Windows.Forms.DataGrid
{
public delegate void TRC(object sender, int row);

public MyDataGrid()
{
this.TopRowChanged += new TRC(this.TRCHandler);
}

public void SetTopRow(int rowNum)
{
ScrollEventArgs args = new ScrollEventArgs(ScrollEventType.LargeIncrement, rowNum);
GridVScrolled(this, args);
}

public event TRC TopRowChanged;
public void TRCHandler(object sender, int row){}

protected override void GridVScrolled(object sender, ScrollEventArgs se)
{
base.GridVScrolled (sender, se);
this.TopRowChanged(sender, se.NewValue);
}

protected override void OnMouseWheel(MouseEventArgs e)
{
base.OnMouseWheel (e);
this.TopRowChanged(this, this.VertScrollBar.Value);
}
}

//フォーム側
private void dg_TopRowChanged(object sender, int row)
{
dg_h.SetTopRow(row);
this.dg.Focus();
Application.DoEvents();
}

マウスのホイールイベントで、フォーカス保持のメソッドによって
画面にちらつきが出ていたので、リフレッシュ前に移動させました。
  • 題名: Re[4]: DataGridで列を固定
  • 著者: いわし
  • 日時: 2005/11/01 10:43:17
  • ID: 13566
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
解決が外れました・・・
解決済み!

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