|
分類:[C#]
C# + FM3.5.1 でWindowsアプリケーションを開発中ですが
DataGridViewの左右列を固定(スクロールさせない)ように
したかったのですが左のみしか固定できないようなので
2つのDataGridViewを用意して縦スクロールを同期させようと
しました。
しかし最後までスクロールさせると1行分程度ずれて表示
されるようになってしまいました。
原因は片側のDataGridViewのみに横スクロールが表示されている
ためと思います。
そこでどちらのDataGridViewにも強制的にスクロールを
表示させればよいかと思い下記のようにしたところ
(なんか少し横にずれますが…)強制的に横スクロールバーが表示
されるようになりました。
しかし、縦スクロールバーの高さが横スクロールバーの高さ分多く表示され
(つまり横スクロールバーは表示されているが存在しないかのように
縦スクロールバーが表示されている)
結局症状は変わらず1行分程度ずれて表示されます。
根本のやりたいことが解決できればOKなのですが
アドバイスいただけると助かります。
//---DataGridViewのカスタムコントロール
/// <summary>
/// 縦スクロールバーの表示
/// </summary>
bool alwaysVerticalScrollBarVisible = false;
public bool AlwaysVerticalScrollBarVisible
{
get { return alwaysVerticalScrollBarVisible; }
set
{
alwaysVerticalScrollBarVisible = value;
if (value == true)
{
this.VerticalScrollBar.Visible = true;
}
}
}
/// <summary>
/// 横スクロールバーの表示
/// </summary>
bool alwaysHorizontalScrollBarrVisible = false;
public bool AlwaysHorizontalScrollBarrVisible
{
get { return alwaysHorizontalScrollBarrVisible; }
set
{
alwaysHorizontalScrollBarrVisible = value;
if (value == true)
{
this.HorizontalScrollBar.Visible = true;
}
}
}
//コンストラクタ
public CustomDataGridView()
{
InitializeComponent();
//スクロールバー表示変更イベント
this.VerticalScrollBar.VisibleChanged +=
new EventHandler(VerticalScrollBar_VisibleChanged);
this.HorizontalScrollBar.VisibleChanged +=
new EventHandler(HorizontalScrollBar_VisibleChanged);
}
void VerticalScrollBar_VisibleChanged(object sender, EventArgs e)
{
if (AlwaysVerticalScrollBarVisible)
{
this.VerticalScrollBar.Visible = true;
}
}
void HorizontalScrollBar_VisibleChanged(object sender, EventArgs e)
{
if (AlwaysHorizontalScrollBarrVisible)
{
this.HorizontalScrollBar.Visible = true;
}
}
private void RDataGridView_Resize(object sender, EventArgs e)
{
SetVerticalBar();
SetHorizontalBar();
}
public void SetVerticalBar()
{
this.VerticalScrollBar.SetBounds(
this.Width - this.VerticalScrollBar.Width - 1,
this.VerticalScrollBar.Location.Y + 1,
this.VerticalScrollBar.Width,
this.Height - 2 - ((this.HorizontalScrollBar.Visible) ? this.HorizontalScrollBar.Height : 0));
}
public void SetHorizontalBar()
{
this.HorizontalScrollBar.SetBounds(
this.HorizontalScrollBar.Location.X + 1,
this.Height - this.HorizontalScrollBar.Height - 1,
this.Width - 2 - ((this.VerticalScrollBar.Visible) ? this.VerticalScrollBar.Width : 0),
this.HorizontalScrollBar.Height);
}
//--
//--Form側
//デザイン上からDataGridViewのプロパティを下記に設定
//縦横とも強制表示で確認している
AlwaysVerticalScrollBarVisible : true
AlwaysHorizontalScrollBarrVisible : true
ScrollBars : Both
//フォームのロードで下記のように記述
private void from1_Load(object sender, EventArgs e)
{
//grd2のほうに強制的に横スクロールを表示させたい
grd2.SetVerticalBar();
grd2.SetHorizontalBar();
}
//スクロール同期
private void grd1_Scroll(object sender, ScrollEventArgs e)
{
if (grd1.RowCount <= 0) return;
if (grd2.RowCount <= 0) return;
grd2.FirstDisplayedScrollingRowIndex = grd1.FirstDisplayedScrollingRowIndex;
}
private void grd2_Scroll(object sender, ScrollEventArgs e)
{
if (grd1.RowCount <= 0) return;
if (grd2.RowCount <= 0) return;
grd1.FirstDisplayedScrollingRowIndex = grd2.FirstDisplayedScrollingRowIndex;
}
//--
|