2016-08-07 11 views
1

DataGridView AutoSizeの高さを、それに含まれる行の量に基づいて作成しようとしています。現在、私は次の行でこれを達成することができました:DataGridView Auto Height - DataGridViewの高さを自動サイズ設定する方法

しかしこれはDataGridViewのを遮断します、水平スクロールバーが表示されなくなります。

水平スクロールバーを失うことなく高さを自動化できますか?

+2

MaximumSizeプロパティを設定します。 –

+0

@HansPassant私は「MaximumSize」をテストして、それが動作しないことを確信させたときに間違いが何をしたのか分かりませんが、あなたのコメントを読んでもう一度試してみました。はい、 '新しいサイズ(this.dataGridView1.Width、0)'の設定は完全に機能しています。 –

+0

@HansPassantしかし、ユーザがグリッドの幅を変更させたい場合、 'MaximumSize'を使うのはそれほど親切ではないので、私は答えに* Option 1 *または* Option 2 *を使うのが好きです。 –

答えて

3

オプション1 - オーバーライドのgetPreferredSize

あなたはDataGridViewGetPreferredSizeメソッドをオーバーライドして、新しい提案サイズnew Size(this.Width, proposedSize.Height)を使用して基本メソッドを呼び出すことができます。自動サイズルールはその高さに適用される一方、この方法では、コントロールの現在の幅はそのまま残ります。

using System.Drawing; 
using System.Windows.Forms; 
public class MyDataGridView : DataGridView 
{ 
    public override Size GetPreferredSize(Size proposedSize) 
    { 
     return base.GetPreferredSize(new Size(this.Width, proposedSize.Height)); 
    } 
} 

オプション2 - 計算の自動サイズの高さに基づいて高さを設定

DataGridViewから派生したくない場合は、GetPreferredSizeを呼び出してnew Size(0, 0)を呼び出し、DataGridViewの高さを結果の高さに設定すると、DataGridViewの高さのみを変更することができます。あなたが必要な場合は、RowsRemovedRowsAddedにいくつかの他のイベントを自動高さを設定する必要があります

void AutoHeightGrid(DataGridView grid) 
{ 
    var proposedSize = grid.GetPreferredSize(new Size(0, 0)); 
    grid.Height = proposedSize.Height; 
} 
private void Form1_Load(object sender, EventArgs e) 
{ 
    dataGridView1.RowsAdded += (obj, arg) => AutoHeightGrid(dataGridView1); 
    dataGridView1.RowsRemoved += (obj, arg) => AutoHeightGrid(dataGridView1); 
    //Set data source 
    //dataGridView1.DataSource = something; 
} 

あなたがFont、行の高さを変えるなど、グリッド内のすべての変更は、グリッドのサイズを変更する原因となりますことを確認するには、あなたをPaintイベントのメソッドを呼び出すことができます。

オプション3 - あなたは、DataGridViewから派生したくないあなたは、グリッドのMaximumSizeプロパティを使用することができれば、ハンスで述べたようにまた

のMaximumSizeを設定します。あなたはnew Size(this.dataGridView1.Width, 0)に設定することができます

dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0); 
dataGridView1.AutoSize = true; 

MaximumSizeを使用すると、ユーザは、左右のアンカーによって、グリッド幅の変更をさせたいときにとてもフレンドリーではありませんので

が、私はオプションを使用することを好みます1またはオプション2

+0

これを実行するには、独自のDataGridViewクラスを作成する必要がありますか? – Reeggiie

+0

このような詳細な回答をいただきありがとうございます。私はオプション2に行った:) – Reeggiie

関連する問題