在datagridview列中格式化datetimepicker

时间:2012-05-14 19:33:04

标签: winforms datagridview customcolumn

我正在尝试使用 this MSDN example on How to host controls in DataGridViewCells. 中的DateTime选择器自定义gridview列类型我想以24小时格式显示小时和分钟,没有秒或AM PM指示符。

我已将EditingControlFormattedValue设置为" HH:mm",如果没有实际编辑,则会正确显示该值。

编辑时,如果在CalendarEditingControl的构造函数中,我将编辑控件设置为CustomFormat =" HH:mm",则控件显示星期几和月份。 (!?)

当我改为使用Format = DateTimePickerFormat.Time时,控件在编辑时显示AM或PM。

如何说服此控件只显示我关心的DateTime值的部分? (C#,VS 2008)

2 个答案:

答案 0 :(得分: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
    }
    

答案 1 :(得分: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;
            }
        }
    }
}