に3つの列がありますDataGridView
。私がやろうとしているのは、最初の2列をコンテンツの幅に自動的に合わせ、3列目を残りのスペースに埋めることです。
WinFormsで実行することは可能ですか?EF DataContextを使用する場合は、データをロードしています。私はそれが現在どのように見えるかの画像を含めました。
に3つの列がありますDataGridView
。私がやろうとしているのは、最初の2列をコンテンツの幅に自動的に合わせ、3列目を残りのスペースに埋めることです。
WinFormsで実行することは可能ですか?EF DataContextを使用する場合は、データをロードしています。私はそれが現在どのように見えるかの画像を含めました。
回答:
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;
重要な注意点:
あなたのグリッドはデータソースと列にバインドされている場合は、自動生成された(されているAutoGenerateColumns
Trueにプロパティセット)、あなたが使用する必要があるDataBindingComplete
スタイルを適用するには、イベントをAFTER列が作成されています。
一部のシナリオ(たとえば、コードによってセルの値を変更する)ではDataGridView1.AutoResizeColumns();
、グリッドを更新するために呼び出す必要がありました。
これは私のお気に入りのアプローチです...
_dataGrid.DataBindingComplete += (o, _) =>
{
var dataGridView = o as DataGridView;
if (dataGridView != null)
{
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
};
index out of bound exception
修正してください。ありがとうございます。
コントロールのプロパティからプロパティを変更するだけです。
AutoSizeColumnsMode:Fill
またはコードで
dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;
テストされていませんが、試してみることができます。テストされ、動作しています。必要なことを達成するために、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;
これはうまくいくはずです
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);
}
}
GridCol
。次に、各列のAutoSizeModeを2つの異なる値に設定します。2番目の割り当ては最初の割り当てを上書きします。
AlfredBrの回答に基づいて、一部の列を非表示にした場合は、以下を使用してすべての列のサイズを自動化し、最後に表示されている列を空のスペースに埋めることができます。
myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode =
DataGridViewAutoSizeColumnMode.Fill;
これは、すべての列で実行できない場合に、列「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;
}
public void setHeight(DataGridView src)
{
src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 + src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}