この記事でできること
DataGridViewのサイズ変更に合わせて、補助情報的な列を自動的に表示したり非表示にします。
ポイント
ご覧の通りDataGridViewのデータが10000行程度であれば、スムーズに表示/非表示が切り替わります。
DataGridViewの列表示を制御する
FormのSizeChangedで発火しています。(DataGridViewをAnchorしているので)
private void Form_SizeChanged(object sender, EventArgs e)
{
DataGridView dg = this.ucGridPager.pagerDataGridView;
// データ0行ならなにもしない
if (dg.RowCount == 0) return;
// AutoSizeMode = Fill の列があれば、一旦FILLからDisplayedCells等へ切り替える
dg.Columns[(int)売上一覧_Col.得意先名].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
// FILL列のない状態で、各列の幅を合計する
int ColWidthSum = 0;
foreach (DataGridViewColumn column in dg.Columns)
{
ColWidthSum += column.Width;
}
// DataGridViewの幅は、各列の幅の合計より大きいか?
if (dg.Width > ColWidthSum)
{
// 十分な幅が確保できていれば、補助情報的な列も表示する。
dg.Columns[(int)売上一覧_Col.得意先コード].Visible = true;
dg.Columns[(int)売上一覧_Col.担当社員番号].Visible = true;
// FILLで表示したい列を元に戻す
dg.Columns[(int)売上一覧_Col.得意先名].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
else
{
// 十分な幅が確保できないので、補助情報的な列は非表示にする。
dg.Columns[(int)売上一覧_Col.得意先コード].Visible = false;
dg.Columns[(int)売上一覧_Col.担当社員番号].Visible = false;
// FILLで表示したい列を元に戻す
dg.Columns[(int)売上一覧_Col.得意先名].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
}
DataGridViewのパフォーマンス向上
DataGridViewを適切に設定しないと、同じ10000行程度のデータでもスムーズに表示/非表示が切り替わりません。
// DataGirdViewのパフォーマンス・チューニング
private void InitDataGridView()
{
// DoubleBuffered
Type dgvtype = typeof(DataGridView);
System.Reflection.PropertyInfo dgvPropertyInfo =
dgvtype.GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.NonPublic);
dgvPropertyInfo.SetValue(dataGridView, true, null);
// AutoSize None
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
// RowHeader false
dataGridView.RowHeadersVisible = false;
}
特にAutoSizeに気をつける
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
がとても重要です。
仮に、
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
とした場合、データ量が多くなるとスムーズに切り替わりません。
サンプルソースの公開