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