C# 设置TimeSpan的字符串格式,该时间跨度仅在天数不为零时才将天数添加到字符串中

C# 设置TimeSpan的字符串格式,该时间跨度仅在天数不为零时才将天数添加到字符串中,c#,winforms,formatting,timespan,C#,Winforms,Formatting,Timespan,我需要设置TimeSpan的格式,以便只有在非零时才显示天 现在我正在使用@“d'days,'hh\:mm”,它将新的时间跨度(1,2,3,4,5)格式化为1天,02:03,但它也将新的时间跨度(0,2,3,4,5)格式化为0天,02:03,这不是我想要的-在这种情况下,我只想要02:03 问题是完全相同的格式将应用于所有的时间跨度,这是我的问题和之间的区别,因此我不能使用如下(伪)代码: if (hasDays) { format = @"dd' days, 'hh\:mm"; }

我需要设置TimeSpan的格式,以便只有在非零时才显示天

现在我正在使用
@“d'days,'hh\:mm”
,它将
新的时间跨度(1,2,3,4,5)
格式化为
1天,02:03
,但它也将
新的时间跨度(0,2,3,4,5)
格式化为
0天,02:03
,这不是我想要的-在这种情况下,我只想要
02:03

问题是完全相同的格式将应用于所有的时间跨度,这是我的问题和之间的区别,因此我不能使用如下(伪)代码:

if (hasDays) {
     format = @"dd' days, 'hh\:mm";
} else {
     format = @"hh\:mm";
}
我不能使用它,条件必须以某种方式编码为格式字符串本身。有可能做到这一点吗


请注意:我对不使用完全相同格式字符串的解决方案不感兴趣。如果这是不可能的,那么说明这一点的答案就足够了。

我认为只有在类似
DataGridView.CellFormatting
的事件中才能做到这一点。在这里,您可以为单元格指定单独的格式


无法使用格式字符串进行条件格式设置;但是,根据显示数据的控件,您可以使用一些解决方案来执行条件格式设置


在Windows窗体中,
ListBox
ComboBox
DataGridView
DataGrid
支持复杂的数据绑定。在本文中,我将展示如何在Windows窗体应用程序中为这些控件执行条件格式设置

  • 列表框和组合框

    void listBox_Format(object sender, ListControlConvertEventArgs e)
    {
        e.Value = FormatValue(e.Value);
    }
    
    FormattingEnabled
    设置为
    true
    并处理
    Format
    事件。使用
    e.Value
    获取项目值并设置格式化值

  • DataGridView

    void dg_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        e.Value = FormatValue(e.Value);
    }
    
    处理
    CellFormatting
    事件。您可以使用
    e.Value
    获取单元格值或设置格式化值

  • 数据网格

    //public class MyDataGridTextBoxColumn : DataGridTextBoxColumn
    protected override object GetColumnValueAtRow(CurrencyManager source, int rowNum)
    {
        var value = base.GetColumnValueAtRow(source, rowNum);
        return FormatValue(value);
    }
    
    您可以基于
    DataGridTextBoxColumn
    创建自定义的
    DataGridColumnStyle
    ,并覆盖
    GetColumnValueAtRow
    并返回格式化值

例子 在以下所有示例中,我使用一种方法格式化值:

string FormatValue(object value)
{
    if (value is TimeSpan)
    {
        var time = (TimeSpan)value;
        if (time.TotalDays < 1.0)
            return time.ToString(@"hh\:mm");
        else
            return time.ToString(@"d' days, 'hh\:mm");
    }
    return string.Format("{0}", value);
}
DataGridView

void dg_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    e.Value = FormatValue(e.Value);
}
数据网格

//public class MyDataGridTextBoxColumn : DataGridTextBoxColumn
protected override object GetColumnValueAtRow(CurrencyManager source, int rowNum)
{
    var value = base.GetColumnValueAtRow(source, rowNum);
    return FormatValue(value);
}

您应该对要使用此格式的列使用此列样式。

“如果不可能,那么说明此格式的答案就足够了。”没有一个格式字符串可以满足您的要求-格式字符串不能包含条件逻辑。@DStanley谢谢。我只是想以防万一,因为例如regex内置了|(OR)操作符,所以谁知道呢。