C# 设置TimeSpan的字符串格式,该时间跨度仅在天数不为零时才将天数添加到字符串中
我需要设置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"; }
@“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)操作符,所以谁知道呢。