1つのDataGridViewColumnにDataGridViewComboBoxCellsとDataGridViewTextBoxCellsの両方を含めることは可能ですか?それとも、列ごとに1つのタイプを持つことに絶対に制限されていますか?
9217 次
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 に答える