【问题标题】:How do I format a DataGrid cell so a time entry from SQL will show up as hh:mm tt?如何格式化 DataGrid 单元格,以便 SQL 中的时间条目显示为 hh:mm tt?
【发布时间】:2012-11-19 22:38:04
【问题描述】:

如果我的 SQL 表中的条目是 09:00:00,我的单元格要么显示为 09:00:00 之类的内容,要么我输入如下字符串格式:

    <DataGridTextColumn Binding="{Binding Path=tin, StringFormat=\{0:hh\\:mm\}}"  Header="Time In:"/>

我到了 9:00。如何将其格式化为像“09:00 AM”这样的短时间字符串?

我尝试过使用 StringFormat=t,它使单元格变为空白。任何使用“t”,单元格都会变为空白。我真的在这里泡菜。

DataGrid 填充了一个名为 displayGrid 的数据集。 entryGrid 是 DataGrid 对象。
entryGrid.ItemsSource = displayGrid.Tables[0].DefaultView;

我在这里寻找的是在 XAML 中抛出的内容以正确格式化。我需要从我的 SQL 2008 表中的 09:00:00 到我的数据网格中的 09:00 AM。我在 VS 2012 中使用 C#.Net 和 XAML。我对编码非常陌生,所以我确信这是一个简单的错误或语法错误。感谢您提供的任何帮助。

编辑:

我什至回去了,尝试使用以下代码自动生成列来格式化单元格:

 private void ResultsDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyType == typeof(DateTime))
        {
            DataGridTextColumn dataGridTextColumn = e.Column as DataGridTextColumn;
            if (dataGridTextColumn.Header.ToString().Equals("wkdate"))
            {
                dataGridTextColumn.Binding.StringFormat = "{0:d}";
            }
            if(dataGridTextColumn.Header.ToString().Equals("tin"))
            {
                dataGridTextColumn.Binding.StringFormat = "{0:t}";

            }
        }
    }

适用于日期,但不适用于时间!这让我发疯。提前致谢!

【问题讨论】:

标签: c# sql-server-2008 xaml wpfdatagrid


【解决方案1】:

根据您的格式,您可以更新现有的 XAML 代码并编写如下:

<DataGridTextColumn Binding="{Binding Path=tin, StringFormat=\{0:hh:mm tt\}}"  Header="Time In:"/>

希望对你有帮助

或者,你能不能在下面。我确信这是可行的,因为我在许多项目中都使用过它。

CS 文件代码:

 [ValueConversion(typeof(DateTime), typeof(string))]
    public class StringTime : IValueConverter
    {
        #region IValueConverter Members
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null || value.ToString() == "")
            {
                return "";
            }
            String str = ((DateTime)value).ToString("hh:mm tt");
            return str;
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null || value.ToString() == "")
            {
                return value;
            }
            DateTime dtr = DateTime.MinValue.Date;
            dtr = dtr.AddYears(1899);
            if (value == null)
                return dtr;
            dtr = dtr.AddHours(double.Parse((value.ToString().Substring(0, 2))));
            dtr = dtr.AddMinutes(double.Parse((value.ToString().Substring(3, 2))));
            if(value.ToString().Substring(7, 2) == "PM")
                dtr = dtr.AddHours(12);

            return dtr;
        }
        #endregion
    }

XAML 文件:

    <Page.Resources>
        <custom:StringTime x:Key="StringTime" />
    </Page.Resources>

DataGrid Column Code:

    <DataGridTextColumn Binding="{Binding Path=tin, Converter={StaticResource StringTime}}"  Header="Time In:"/>

如果您有任何问题,请告诉我。

【讨论】:

  • 同样,这只会使单元格变为空白。我认为可能存在更深层次的问题,因为我尝试过的所有代码都应该可以工作,只是当我尝试为 AM PM 格式化时,它变成空白。感谢您的帮助!
  • @JMac 我已经用详细描述更新了解决方案,有点冗长但效果很好。
  • 好吧,我快到了。最后一个问题是让 xaml 获取 StringTime.cs。我在 WPFApplication 中有自定义作为定义的命名空间,而 stringtime 是其中的一个类....所以它不应该显示为命名空间中的存在吗?再次感谢您的帮助!
  • 好的,所以我使用您的代码来获取信息的数据类型,并了解到 SQL Server 的“时间”类型是作为时间跨度而不是日期时间拉出来的!现在我觉得超级愚蠢,但将使用您的代码将时间跨度转换为可显示的时间。感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多