3

DataGridViewCells でコントロールをホストする方法に関するこの MSDN の例から、DateTime ピッカー カスタム グリッドビュー列タイプを使用しようとしています。時間と分を 24 時間形式で、秒または AM PM インジケーターなしで表示したいと考えています。

EditingControlFormattedValue を "HH:mm" に設定しましたが、実際に編集していないときは値が正しく表示されます。

編集時に、CalendarEditingControl のコンストラクターで編集コントロールを CustomFormat = "HH:mm" に設定すると、コントロールは曜日と月を表示します。(!?)

代わりに Format = DateTimePickerFormat.Time を使用すると、編集時にコントロールに AM または PM が表示されます。

このコントロールに、DateTime 値の重要な部分のみを表示させるにはどうすればよいでしょうか? (C#、VS 2008)

4

2 に答える 2

3

リンクされたコードを希望どおりに機能させるには、いくつかの調整が必要です。

  • CalendarCell()コンストラクターのハードコードされた行をコメントアウトします(this.Style.Format = "d";

  • カスタム指定の形式を使用するようにCalendarEditingControlに指示します。

  • デザイナで、必要なフォーマットを設定します(EditColumns-> DefaultCellStyle-> Format)

    public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
    {
        this.Format = DateTimePickerFormat.Custom;
        this.CustomFormat = dataGridViewCellStyle.Format;
        // ... other stuff
    }
    
于 2012-05-14T20:04:06.423 に答える
1

次の変更を加える必要があることがわかりました。

CalendarCell のコンストラクターで、形式を 24 時間に変更します。

public CalendarCell()
    : base()
{
    // Use the 24hr format.
     //this.Style.Format = "d";
     this.Style.Format = "HH:mm";
}

編集コントロールのコンストラクターで、カスタム形式を使用するように指定します。ShowUpDownまた、セルを編集するときにカレンダー アイコンを表示しないように、自由に true を設定しました。

public CalendarEditingControl()
{
    //this.Format = DateTimePickerFormat.Short;
    this.Format = DateTimePickerFormat.Custom;
    this.CustomFormat = "HH:mm";
    this.ShowUpDown = true;
}

EditingControlFormattedValue を変更します。これは実際には必要ないように見えますが、そのままにしておくのは気分が悪くなります。

// Implements the IDataGridViewEditingControl.EditingControlFormattedValue 
// property.
public object EditingControlFormattedValue
{
    get
    {
        //return this.Value.ToShortDateString();
        return this.Value.ToString("HH:mm");
    }
    set
    {
        if (value is String)
        {
            try
            {
                // This will throw an exception of the string is 
                // null, empty, or not in the format of a date.
                this.Value = DateTime.Parse((String)value);
            }
            catch
            {
                // In the case of an exception, just use the 
                // default value so we're not left with a null
                // value.
                this.Value = DateTime.Now;
            }
        }
    }
}
于 2012-05-14T20:20:42.387 に答える