У меня есть поле даты и времени в сетке.
Мне нужно, чтобы поле даты было нулевым или пустым, если база данных возвращает либо ноль, «», либо 1/1/0001.
Как этого добиться? Кажется, у меня заморозка мозга.
Вы можете увидеть, что я пробовал здесь:
<asp:TemplateField HeaderText = "LastEval" ItemStyle-CssClass = "gvColumnSmallCss">
<ItemTemplate >
<asp:Label ID = "lblmyLabel" Text='<%# Bind("myField","{0:M/d/yyyy}") %>' runat = "server" > </asp:Label>
<%-- Text= ' <%# Eval("myField") !=null ? Convert.ToDateTime(Eval("myField")).ToString("MM/dd/yyyy") : "" %>'
--%>
<%-- Text='<%# Bind("myField","{0:M/d/yyyy}") %>'--%>
</ItemTemplate>
Код С#:
protected void gv_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string myField;
myField= (e.Row.FindControl("lblmyField") as Label).Text;
DateTime? myField= null;
_myField = string.IsNullOrEmpty(myField)
? (DateTime?)null
: (DateTime?)DateTime.Parse(myField);
DateTime checkDate = DateTime.Parse("1/1/00001");
if (lastEval == checkDate.ToString() || myField= = "")
{
(e.Row.FindControl("lblmyField") as Label).Text = "";
}
}
}
Я также пробовал подобное в методе обработчика RowDataBound
.
string myField; myField= (e.Row.FindControl("lblmyField") as Label).Text; DateTime? myField= null;
<- Это даже не должно компилироваться (повторяющееся имя). Это ошибка копирования и вставки?
«DateTime? myField= null; <- Это даже не должно компилироваться. Это ошибка копирования и вставки?» что ты имеешь в виду? ДатаВремя? мое поле = ноль; вот как вы можете установить для даты и времени значение null
Да, но прямо над ним вы объявляете еще одну переменную типа string с тем же именем. Это не работает.
ох, это была опечатка
что заполняет GridView? List<T> или DataTable/DataSet?
Сделайте это с помощью команды SELECT
, извлекая данные из базы данных.
Поле реальной даты не должно возвращать пустую строку. Если да, то это серьезная ошибка в проектировании схемы. Поскольку Eval() возвращает Object
, а не строку, если вам приходится вызывать Convert.ToDateTime()
по результату Eval("myField")
, а не просто приводить, это также является вероятным признаком серьезной ошибки в проектировании схемы.
Я решил это следующим образом, если у кого-то есть подобная проблема:
<asp:Label ID = "lblmyLabel" Text= '<%# Convert.ToDateTime(Eval("myField")) != Convert.ToDateTime("01/01/0001") ? Convert.ToDateTime(Eval("myField")).ToString("MM/dd/yyyy") : "" %>' runat = "server" > </asp:Label>
Лучше использовать вспомогательную функцию, чем добавлять логику в разметку.
наценка
<asp:Label ID = "lblEvalDate" runat = "server"
Text='<%# CheckEvalDate(Eval("EvalDate")) %>'>
</asp:Label>
код программной части
protected string CheckEvalDate(object dt)
{
DateTime evalDate;
if (dt == DBNull.Value || !DateTime.TryParse(dt.ToString(), out evalDate))
{
return string.Empty;
}
return evalDate == DateTime.MinValue ?
string.Empty : evalDate.ToString("M/d/yyyy");
}
Пожалуйста, используйте правильный регистр и отформатируйте код. Чем лучше, тем больше вероятность того, что кто-то захочет вам помочь.