<概要>
DataGridViewのあるカラムに、カンマ付き数値を表示。
編集のタイミングでカンマを取って編集したい。
<例>
private void dgvList_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == 8)
{
//編集中じゃなきゃ、カンマ付きにフォーマット
if (dgvList[e.ColumnIndex, e.RowIndex].IsInEditMode == false)
{
//e.Valueのチェックとかいるかもね
e.Value = e.Value.ToString("###,##0");
}
else
{
}
}
}
private void dgvList_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
if (e.ColumnIndex == 8)
{
//フォーマットの仕方は、ご自由に
dgvList[e.ColumnIndex, e.RowIndex].Value = dgvList[e.ColumnIndex, e.RowIndex].Value.ToString().Replace(",", string.Empty);
}
}
<例 補足>
e.ColumnIndex == 8の列には、数値系型のデータがバインドされてる。
実装時には、DataGridViewTextBoxColumn等のカラムオブジェクト.Indexがスマートかな?
<ポイント>
・CellFormattingイベント内で、IsInEditModeによって、編集中かどうかを判断。(カンマをつける)
・CellBeginEditで、イベント内で編集用フォーマットに切り替える。(カンマを取る)
・CellBeginEditでカンマ取っても、Valueにセットする行為で、CellFormattingイベントが発生するのでIsInEditModeでの判断を入れないと無駄(取った瞬間、カンマ付きになるので永遠にカンマ付き)
<まとめ>
表示フォーマットと編集フォーマットが違う場合には、上記でいけそうだ。
注意するのは、「単純に表示時にカンマつけてよ!」って仕様書に書いてる時は、CellFormattingでしちゃだめです。
理由は、重いから。昨日のエントリ見て下さい。
http://blogs.wankuma.com/koutarou/archive/2006/08/31/37323.aspx#37324
<今日の感想>
DataGridViewは、イベント多すぎで手ごわいな。。。
ヘルプとかだけじゃ掴みきれないし、Google様もあまり教えてくれない。