none
dataGridViewの列の表示のしかた -横スクロールに関連して RRS feed

  • 質問

  • dataGridViewの横幅に対して列の数が多すぎて納まりきらないときに横スクロールバーが現れますが,このときのスクロール範囲の設定についておたずねします。

    例として A B C D E F G の列があったとして,いま見えているのは A B C D E の4列だとします。

    このとき,「左右のA列とG列は必ず表示し B C D E F の部分だけをスクロールさせる方法」を知りたいのです。

    よろしくお願いします。

     

    2010年8月13日 23:06

回答

  • DataGridViewには列を固定する機能がありますが、左側を固定することはできても、右側を固定することはできません。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/509dgvfrozen/dgvfrozen.html

     

    DataGridView の機能だけでは無理なので、例えば

     

    • SplitContainer の中に DataGridView を2つ横に並べて配置
    • 左側のDataGridViewにA~F列を表示
    • A列を固定
    • 右側のDataGridViewにG列を表示
    という風にして、それっぽく見せる方法はどうでしょうか。2つのDataGridViewの状態を揃える工夫が必要ですが・・・。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク nrael 2010年8月14日 1:08
    • 編集済み なかむら 2010年8月14日 11:16
    2010年8月14日 0:01

すべての返信

  • DataGridViewには列を固定する機能がありますが、左側を固定することはできても、右側を固定することはできません。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/509dgvfrozen/dgvfrozen.html

     

    DataGridView の機能だけでは無理なので、例えば

     

    • SplitContainer の中に DataGridView を2つ横に並べて配置
    • 左側のDataGridViewにA~F列を表示
    • A列を固定
    • 右側のDataGridViewにG列を表示
    という風にして、それっぽく見せる方法はどうでしょうか。2つのDataGridViewの状態を揃える工夫が必要ですが・・・。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク nrael 2010年8月14日 1:08
    • 編集済み なかむら 2010年8月14日 11:16
    2010年8月14日 0:01
  • そうでしたか,やはりなかったのですね。

    >SplitContainer の中に DataGridView を2つ横に並べて配置

    この方法でやってみようと思います。なかむらさん,ありがとうございます。

    2010年8月14日 1:08
  • SplitContainerが肝ではなく、なかむらさんも言われていますが複数のDataGridViewの状態を揃える工夫が必要です。その中でも重要なのは縦スクロールの同期でしょう。簡単なサンプルを書いてみました。

    VScrollBar vsBar1;
    VScrollBar vsBar2;
    
    private void Form1_Load(object sender, EventArgs e)
    {
       // TODO: このコード行はデータを 'tESTDataSet.DataTable1' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
       this.dataTable1TableAdapter.Fill(this.tESTDataSet.DataTable1);
    
       foreach (Control c in dataGridView1.Controls)
       {
         if (c is VScrollBar)
         {
            vsBar1 = (VScrollBar)c;
            vsBar1.ValueChanged += (a, b) => vsBar2.Value = vsBar1.Value;
            break;
         }
       }
    
       foreach (Control c in dataGridView2.Controls)
       {
         if (c is VScrollBar)
         {
            vsBar2 = (VScrollBar)c;
            vsBar2.ValueChanged += (a, b) => vsBar1.Value = vsBar2.Value;
            break;
         }
       }
    
       dataGridView1.Scroll += (a, b) => dataGridView2.FirstDisplayedScrollingRowIndex = dataGridView1.FirstDisplayedScrollingRowIndex;
       dataGridView2.Scroll += (a, b) => dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView2.FirstDisplayedScrollingRowIndex;
    }
    

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年8月14日 6:44
    モデレータ
  • trapemiyaさんサンプルの表示,ありがとうございます。

    今回は横スクロールだけですので,必要とする機会がありましたらありがたく使わせて頂きます。

     

    2010年8月15日 0:37