書式設定に使用している方法は有効なアプローチです。ここで発生する可能性のある問題がいくつかあります。確認してください:
- 基になるデータは typeであり、 typeでは
DateTime
ありませんstring
。Typestring
は期待どおりにフォーマットを適用しません。(以下の例の列 1 と 2 を参照してください。 )
- 個人
DataGridViewTextBoxCell.Style.Format
が希望する形式とは異なる形式に設定されていません。これにより、列の書式が上書きされます。(以下の例の列 3 を参照してください。 )
例
this.dataGridView1.ColumnCount = 4;
this.dataGridView1.RowCount = 1;
this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
DateTime date = DateTime.Now;
this.dataGridView1[0, 0].Value = date;
this.dataGridView1[1, 0].Value = date.ToString();
this.dataGridView1[2, 0].Value = date.ToString("MM/yyyy");
this.dataGridView1[3, 0].Value = date;
this.dataGridView1[3, 0].Style.Format = "MM/yyyy";
this.dataGridView1.Columns[0].DefaultCellStyle.Format = "dd/yyyy";
this.dataGridView1.Columns[1].DefaultCellStyle.Format = "dd/yyyy";
this.dataGridView1.Columns[2].DefaultCellStyle.Format = "dd/yyyy";
this.dataGridView1.Columns[3].DefaultCellStyle.Format = "dd/yyyy";

出力からわかるように:
Columns[0]
には が含まれ、DateTime
として正しくフォーマットされ"dd/yyyy"
ます。
Columns[1]
には が含まれており、string
に再フォーマットすることはできません"dd/yyyy"
。
Columns[2]
にはフォーマット済みの が含まれており、string
に再フォーマットすることはできません"dd/yyyy"
。
Columns[3]
には が含まれてDateTime
おり、書式はセルの書式によって上書きされます"MM/yyyy"
。
これらの問題を修正するには、表現DateTime
ではなく、オブジェクトを使用してセル値を設定するだけstring
です。
外部ソースからこのデータを取得していて、それがすでにtypestring
である場合は、取得できますがParse
、オブジェクトの欠落部分はDateTime
デフォルトで設定され、元の完全なデータがなければそれについてできることは何もないことに注意してください。 :
DateTime date = DateTime.Parse("10/2016");
Console.WriteLine("Output: {0}", date.ToString());
// Output: 10/1/2016 12:00:00 AM
検証
ユーザー入力の検証 (および編集時に書式設定が失われること) が主な関心事である場合は、無効な編集をキャンセルするための次の検証方法を検討してください。
private void DataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
DateTime parsed;
if (!DateTime.TryParse(e.FormattedValue.ToString(), out parsed))
{
this.dataGridView1.CancelEdit();
}
}
イベントハンドラーを使用してフォーマットを再適用するためのこの回答と組み合わせてください。DataGridView.CellFormatting
(これにより、データ型が ではないことを確認する必要もなくなることに注意してください。ただしstring
、イベントが頻繁にトリガーされるため、よりコストがかかります。)