DataGridViewの自動調整と塗りつぶし


82

に3つの列がありますDataGridView。私がやろうとしているのは、最初の2列をコンテンツの幅に自動的に合わせ、3列目を残りのスペースに埋めることです。

WinFormsで実行することは可能ですか?EF DataContextを使用する場合は、データをロードしています。私はそれが現在どのように見えるかの画像を含めました。

ここに画像の説明を入力してください

回答:


165

DataGridViewColumn.AutoSizeModeプロパティを使用する必要があります。

列0および1には、これらの値の1つを使用できます。

AllCells: 列の幅は、ヘッダーセルを含む列内のすべてのセルの内容に合わせて調整されます。
AllCellsExceptHeader: 列幅は、ヘッダーセルを除く列内のすべてのセルの内容に合わせて調整されます。
DisplayedCells: 列の幅は、ヘッダーセルを含め、現在画面に表示されている行にある列のすべてのセルの内容に合わせて調整されます。
DisplayedCellsExceptHeader: 列幅は、ヘッダーセルを除き、現在画面に表示されている行にある列のすべてのセルの内容に合わせて調整されます。

次に、列2の塗りつぶし値を使用します

列の幅は、すべての列の幅がコントロールの表示領域を正確に埋めるように調整されます。

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

他のユーザーが指摘しているように、デフォルト値はプロパティとdatagridview同じレベルで設定できDataGridView.AutoSizeColumnsModeます。

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

になり得る:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

重要な注意点:

あなたのグリッドはデータソースと列にバインドされている場合は、自動生成された(されているAutoGenerateColumnsTrueにプロパティセット)、あなたが使用する必要があるDataBindingCompleteスタイルを適用するには、イベントをAFTER列が作成されています。


一部のシナリオ(たとえば、コードによってセルの値を変更する)ではDataGridView1.AutoResizeColumns();、グリッドを更新するために呼び出す必要がありました。


1
DataBindingCompleteイベントを使用する場合は完全に機能します。
ジェームズジェフリー

データグリッドにデータが入力された後、DataBindingCompleteメソッドを呼び出す方法がわかりません
Dan

@Dan DataBindingCompleteはメソッドではなく、サブスクライブする必要があるdatagridviewイベントです。この回答stackoverflow.com/a/31685874/2387010は例を示しています。それは役に立ちますか?
クリス

例が説明されていれば役に立ちますが、それで十分です。あなたがあなたの記事でにリンクされていることをMSDNの記事私は私のパターンとして使用するものですが、それが呼び出される方法を見つけ出すことはできません方法、などを示し、それを。
ダン

1
@Chrisその不足している情報は間違いなく役に立ちます、ありがとう。私は読んでいます。この本をし、ちょうどこれがうまくいけばすぐにより多くの意味を行いますので、デリゲートとラムダ関数の章になりました。ありがとうございました!
ダン

22

これは私のお気に入りのアプローチです...

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };

列サイズ= 0の場合は、index out of bound exception修正してください。ありがとうございます。
TiyebM

14

コントロールのプロパティからプロパティを変更するだけです。 AutoSizeColumnsMode:Fill

またはコードで

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;


1
ありがとうございました。私はこのような解決策を探していました!:)
Alin Ciocan 2016年

4

テストされていませんが、試してみることができます。テストされ、動作しています。必要なことを達成するために、AutoSizeModeで遊んでDataGridViewColumいただければ幸いです。

設定してみてください

dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode

//Set the following properties after setting datasource
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

これはうまくいくはずです


これは機能しません。DataContextからデータソースが追加される前にフォームが初期化されるときに設定しています。それが理由でしょうか?データは実行時にロードされ、列はEFモデルから取得されるため、どこに設定すればよいかわかりません。
ジェームズジェフリー2013

そのように見えますが、そうではありません。3行目は機能しません。これを10分前にテストしました。
キングキング

@JamesJeffery列を自動入力しますか、それとも手動で入力しますか?
Sriram Sakthivel 2013

@SriramSakthivel dataGridView1.DataSourceプロパティを使用して、DataContextから返されたリストをバインドしています。
ジェームズジェフリー2013


0
public static void Fill(DataGridView dgv2)
   {
        try
        {
            dgv = dgv2;
            foreach (DataGridViewColumn GridCol in dgv.Columns)
            {
                for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++)
                {
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                    GridCol.DataGridView.Columns[j].FillWeight = 1;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

1
このコードは素晴らしいものではありません。まず、ネストされたループは必要ありません。ネストされたループは、すべての列の幅モードを同じものに何度も(<列数>)設定します。から直接、各列のAutoSizeModeプロパティとFillWeightプロパティにアクセスできますGridCol。次に、各列のAutoSizeModeを2つの異なる値に設定します。2番目の割り当ては最初の割り当てを上書きします。
JonP 2016年

0

AlfredBrの回答に基づいて、一部の列を非表示にした場合は、以下を使用してすべての列のサイズを自動化し、最後に表示されている列を空のスペースに埋めることができます。

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;

0

これは、すべての列で実行できない場合に、列「first_name」がスペースを埋めるようにするために行ったことです。

グリッドが小さくなると、列「first_name」はほとんど見えなくなります(非常に薄くなります)ので、DataGridViewAutoSizeColumnModeを他の表示列と同じようにAllCellsに設定できます。パフォーマンスの問題については、データをバインドする前にそれらをNoneに設定し、グリッドのDataBindingCompleteイベントハンドラーでAllCellに戻すことが重要です。それが役に立てば幸い!

private void dataGridView1_Resize(object sender, EventArgs e)
    {
        int ColumnsWidth = 0;
        foreach(DataGridViewColumn col in dataGridView1.Columns)
        {
            if (col.Visible) ColumnsWidth += col.Width;
        }

        if (ColumnsWidth <dataGridView1.Width)
        {
            dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
        else if (dataGridView1.Columns["first_name"].Width < 10) dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }

-1
public void setHeight(DataGridView src)
{
    src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 +   src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}

その関数を呼び出すだけで、行数に基づいてデータグリッドビューの高さを決定します
Durga Prasad Guntoju 2013

1
まず第一に、それはOPの質問に答えません。また、(将来の参照用に)回答自体にそのようなコメントを含めます(編集できます)。
ジョエル

-2

これを試して :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.