C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DataGridViewのスクロール同期


(過去ログ 140 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■82049 / inTopicNo.1)  DataGridViewのスクロール同期
  
□投稿者/ アブサン (32回)-(2016/12/02(Fri) 15:20:50)

分類:[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;
        }
//--

引用返信 編集キー/
■82064 / inTopicNo.2)  Re[1]: DataGridViewのスクロール同期
□投稿者/ アブサン (33回)-(2016/12/05(Mon) 09:11:55)
No82049 (アブサン さん) に返信

少し横にずれる事象は下記変更で直りましたが解決に至っておりません。

public void SetVerticalBar()
{
    this.VerticalScrollBar.SetBounds(
        this.Width - this.VerticalScrollBar.Width - 1,
        1,  //ここを変更
        this.VerticalScrollBar.Width,
        this.Height - 2 - ((this.HorizontalScrollBar.Visible) ? this.HorizontalScrollBar.Height : 0));
}

public void SetHorizontalBar()
{
    this.HorizontalScrollBar.SetBounds(
        1,  //ここを変更
        this.Height - this.HorizontalScrollBar.Height - 1,
        this.Width - 2 - ((this.VerticalScrollBar.Visible) ? this.VerticalScrollBar.Width : 0),
        this.HorizontalScrollBar.Height);
}


また、追加で気づいた点としてスクロールバーのつまみが表示されない状態
(全データが画面に収まる状態)ではスクロールバーが思惑通りの
正しいサイズで表示されます。
しかし 画面をリサイズしてつまみが表示される状態にすると
縦スクロールバーが1行分程度(おそらく横スクロールバーの縦幅分)
多く表示されます。

何か処理が不足しているのでしょうか…。
よろしくお願いいたします。

引用返信 編集キー/
■82069 / inTopicNo.3)  Re[2]: DataGridViewのスクロール同期
□投稿者/ アブサン (34回)-(2016/12/05(Mon) 18:26:25)
No82064 (アブサン さん) に返信

DataGridViewにはスクロールバーを表示しない設定とし
VScrollBarとHScrollBarを配置して別途制御することに
しました。

お騒がせしました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -