6

1つのDataGridViewColumnにDataGridViewComboBoxCellsとDataGridViewTextBoxCellsの両方を含めることは可能ですか?それとも、列ごとに1つのタイプを持つことに絶対に制限されていますか?

4

1 に答える 1

8

これには奇妙な解決策があります。
デフォルトでは、列をTextBoxとして作成します。
セルクリックまたはセル入力イベントを処理します。
ColumnIndexが一致する場合は、列タイプをComboBoxに変換し、項目を設定します。
それぞれの列インデックスからセル脱退イベントが発生したら、それをテキストボックスに変換し直します。
変換する前にComboからテキストを読み、TextBoxに設定することを忘れないでください。

私はこれが適切な解決策ではないことを知っていますが、機能します。
誰かがもっと良いアイデアを持っているかどうか知りたいです。

質問者の編集:

これが私が最終的に書いたコードです:

// Using CellClick and CellLeave in this way allows us
// to stick combo boxes in a particular row, even if the
// parent column type is different
private void dataGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex >= FIRST_COL && e.ColumnIndex <= LAST_COL && e.RowIndex == ROW_OF_INTEREST)
    {
        object value = dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
        dataGrid.Columns[e.ColumnIndex].CellTemplate = new DataGridViewComboBoxCell();
        var cell = new DataGridViewComboBoxCell {Value = value};
        cell.Items.AddRange(_values);
        dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex] = cell;
    }
}

private void dataGrid_CellLeave(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex >= FIRST_COL && e.ColumnIndex <= LAST_COL && e.RowIndex == ROW_OF_INTEREST)
    {
        object value = dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
        dataGrid.Columns[e.ColumnIndex].CellTemplate = new DataGridViewTextBoxCell();
        var cell = new DataGridViewTextBoxCell {Value = value};
        dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex] = cell;
    }
}

また、列を作成するときは、それが汎用列であることを確認する必要がありました。つまり、DataGridViewTextBoxColumnではありません:

var col = new DataGridViewColumn
              {
                  CellTemplate = new DataGridViewTextBoxCell()
              };

そうすれば、後でCellTemplateを変更できます。

于 2011-10-03T19:03:52.870 に答える