DataGridViewメモ(0)
仕事でC#のDataGridViewを使う必要がある度にほぼ1から再入門してる気がするのでメモ。
CurrentCellへの変更を反映
例えばmyGridView[0, 0].Value = "true"てな感じでDataGridViewComboBoxCellの値を変更する場合、変更したセルがCurrentCellだとフォーカスが外れるまで変更が描画されない。
それを避けるには以下のようにする。
//CurrentCellへの変更を反映 myGrid.CurrentCell = null;
Excelライクな挙動
ヘッダクリック時の列、行選択の挙動をExcelライクにする。
private void myGrid_MouseDown(object sender, MouseEventArgs e) { System.Windows.Forms.DataGridView.HitTestInfo hti = myGrid.HitTest(e.X, e.Y); if (hti.ColumnIndex == -1 && hti.RowIndex >= 0) { //行ヘッダクリック if (myGrid.SelectionMode != DataGridViewSelectionMode.RowHeaderSelect) { myGrid.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect; } if (e.Button == MouseButtons.Right) { if (!myGrid.Rows[hti.RowIndex].Selected) { foreach (DataGridViewRow row in myGrid.Rows) { row.Selected = false; } } myGrid.Rows[hti.RowIndex].Selected = true; } } else if (hti.RowIndex == -1 && hti.ColumnIndex >= 0) { //列ヘッダクリック if (myGrid.SelectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) { myGrid.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect; } if (e.Button == MouseButtons.Right) { if (!myGrid.Columns[hti.ColumnIndex].Selected) { foreach (DataGridViewColumn col in myGrid.Columns) { col.Selected = false; } } myGrid.Columns[hti.ColumnIndex].Selected = true; } } }
ヘッダ特有の右クリックメニュー
ヘッダのみにContextMenuを設定。
//ヘッダにContextMenuを設定 myGrid.Columns[0].HeaderCell.ContextMenuStrip myGrid.Rows[0].HeaderCell.ContextMenuStrip