2016-12-16 45 views
1

私は、ユーザーが関係のないデータを入力するのを防ぐセルでフォーマット/マスクを作成する必要があります。DataGridViewセルで書式マスクを作成する方法は?

列セルには、曜日値のない"MM/YYYY"のような日付値が含まれています。

私はこの定義を行うために、以下のが、成功せずに試してみました:

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

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

+0

問題を解決できましたか? – OhBeWise

答えて

1

is a valid approachのフォーマットに使用している方法。ここで起こっている問題がいくつかあります。確認してください:

  1. 基礎となるデータは、タイプDateTimeないタイプstringです。タイプstringは、期待どおりにフォーマットを適用しません。 (下記の例の列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"; 

Cols output: 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表現を使用してセルの値を設定し、これらの問題を修正します。あなたには、いくつかの外部ソースから、このデータを取得している場合には

、それはすでにタイプ string、あなたがそれを Parseが、注意することができますの DateTimeオブジェクトの欠けている部分がデフォルトに設定されていることだと何が本当にそこにあなたがすることができません

DateTime date = DateTime.Parse("10/2016"); 
Console.WriteLine("Output: {0}", date.ToString()); 

// Output: 10/1/2016 12:00:00 AM 

検証

:オリジナルの完全なデータがなくても、それについて行いますDataGridView.CellFormattingイベントハンドラを使用してフォーマットを再適用するためにthis answerと相まって

private void DataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
{ 
    DateTime parsed; 
    if (!DateTime.TryParse(e.FormattedValue.ToString(), out parsed)) 
    { 
     this.dataGridView1.CancelEdit(); 
    } 
} 

ユーザー入力の検証(および編集上の書式負け)の場合は、無効な編集をキャンセルするには、検証のために以下の方法を検討し、あなたの主な関心事です。 (これはまた、データ型がstringではないことを確実にする必要性を否定しますが、イベントが頻繁にトリガーされるためにコストがかかります)。

関連する問題