Форматирование столбцов для ASP.Net GridView на основе типа данных

StackOverflow https://stackoverflow.com/questions/250937

Вопрос

У меня есть очень простая ASP.Net страница, которая действует как интерфейс для хранимой процедуры.Он просто запускает процедуру и показывает выходные данные с помощью элемента управления gridview:общий объем кода составляет менее 40 строк, включая разметку aspx.Хранимая процедура сама по себе очень...изменчивый.Он используется для ряда целей, и формат вывода регулярно меняется.

Все это отлично работает, потому что элементу управления gridview на самом деле не нужно заботиться о том, какие столбцы возвращает хранимая процедура:он просто показывает их на странице, а это именно то, что я хочу.

Однако база данных, с которой это выполняется, имеет несколько столбцов datetime повсюду, где временная часть на самом деле не важна - она всегда обнуляется.Что я хотел бы иметь возможность делать, так это управлять форматированием только столбцов datetime в gridview, даже не зная точно, какие это будут столбцы.Каждый раз, когда столбец в результатах имеет тип datetime, просто примените заданную строку формата, которая обрезает временную составляющую.

Я знаю, что мог бы преобразовать в varchar в базе данных, но я бы действительно не хотел, чтобы разработчики заботились о форматировании в запросе, и это в любом случае относится к уровню представления.Есть еще какие-нибудь идеи?


Наконец-то это заработало приемлемым (или, по крайней мере, улучшенным) способом, используя этот код:

Protected Sub OnRowDatabound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim d As DateTime
        For Each cell As TableCell In e.Row.Cells
            If Date.TryParse(cell.Text, d) AndAlso d.TimeOfDay.Ticks = 0 Then
                cell.Text = d.ToShortDateString()
            End If
        Next cell
    End If
End Sub
Это было полезно?

Решение

Если вы автоматически генерируете столбцы, как это звучит, похоже, что вы есть.Процедура использования форматирования сеток ужасна.

Вам нужно будет перебрать все столбцы сетки, возможно, в событии databound, и применить выражение форматирования к любому столбцу, который, как вы обнаружите, является столбцом даты.

Если вы не генерируете автоматически, а кодируете столбцы в своей таблице, вы также уже будете знать, какие столбцы являются столбцами даты, и вы можете применить то же выражение формата к этому столбцу.Это что-то вроде {0: ddmmyyyyy}, но вам придется поискать это, поскольку это, вероятно, не совсем правильно.

итак, чтобы подвести итог, подключитесь к событию databound.просмотрите коллекцию столбцов и убедитесь, является ли этот столбец столбцом даты.Интересно, как вы могли бы это сделать :).Если вы решили, что столбец является столбцом даты, задайте выражение его формата.

Вуаля

---------------------- РЕДАКТИРОВАТЬ

Хорошо, как насчет того, чтобы написать свой метод, который возвращает данные из процедуры для возврата datatable.Вы можете привязать таблицу данных к своей сетке после форматирования данных в таблице данных.Коллекция datatable.Columns представляет собой совокупность столбцов данных, и у них есть свойство DataType.Возможно, вы ищете System.DateTime или DateTime, и это может быть одно из свойств самого свойства DataType :).Я знаю, что это громоздко, но то, о чем вы просите, определенно будет громоздким.После того, как вы определили столбцы дат, возможно, вы сможете что-то с этим сделать.

Если нет, я бы начал просматривать устройства чтения данных и посмотрел, можно ли что-нибудь сделать там или с помощью адаптеров данных.Я хотел бы дать вам правильный ответ, но я думаю, что, как бы вам ни удалось это сделать, это будет некрасиво.Извините

Другие советы

если возможно использование явно связанных столбцов, добавьте DataFormatString в ваше BoundField

<asp:BoundField DataField="Whatever" ... DataFormatString="{0:dd/MM/yyyy}" HtmlEncode="False"/ > 

в противном случае вы могли бы рассмотреть возможность форматирования GridView.Событие OnRowDataBound

Вы можете использовать функцию IsDate (), чтобы проверить, является ли что-то действительной датой, а затем использовать параметры форматирования даты, чтобы это выглядело так, как вы хотите.

Несколько примеров форматирования даты:http://datawebcontrols.com/faqs/CustomizingAppearance/FormatDateTimeData.shtml

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top