2

ユーザーが関係のないデータを入力できないように、セルにフォーマット/マスクを作成する必要があります。

列のセルには"MM/YYYY"、日の値がない場合と同様に日付の値が含まれています。

この定義を行うために次のことを試みましたが、成功しませんでした。

dataGridView1.Columns[0].DefaultCellStyle.Format = "##/####" // || dd/yyyy

DataGridViewまた、プロパティに移動してそこから定義しようとしFormatました。

4

1 に答える 1

1

書式設定に使用している方法は有効なアプローチです。ここで発生する可能性のある問題がいくつかあります。確認してください:

  1. 基になるデータは typeであり、 typeではDateTimeありませんstring。Typestringは期待どおりにフォーマットを適用しません。(以下の例の列 1 と 2 を参照してください。 )
  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";

列出力: 16/2016、12/16/2016 8:52:17 AM、12/2016、12/2016

出力からわかるように:

  1. Columns[0]には が含まれ、DateTimeとして正しくフォーマットされ"dd/yyyy"ます。
  2. Columns[1]には が含まれており、stringに再フォーマットすることはできません"dd/yyyy"
  3. Columns[2]にはフォーマット済みの が含まれており、stringに再フォーマットすることはできません"dd/yyyy"
  4. 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、イベントが頻繁にトリガーされるため、よりコストがかかります。)

于 2016-12-16T14:34:35.267 に答える