我正在创建一个网格视图,允许用户输入特定工件的日期(例如完成日期((有多个(。如果我试图输入一个null或空值,它会崩溃。我到处寻找答案。他们输入的数据将更新到sql server数据库中。我已经在date和nvarchar之间来回切换了数据。此外,该值必须绑定,以便更新ASP.net中的数据库。
代码ASP.NET
<asp:TemplateField HeaderText="Verify Info Prod & Maturity Level" SortExpression="IPMaturity">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("IPMaturity") %>' Width="75"></asp:TextBox>
<asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" Text="Complete" Checked='<%# Bind ("CheckBox1") %>'></asp:CheckBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblIPMat" runat="server" Text='<%# Eval("IPMaturity") %>' Width="75"></asp:Label>
</ItemTemplate>
<HeaderStyle CssClass="verticaltext" Height="140px" Width="88px" HorizontalAlign="Center" VerticalAlign="Bottom" />
</asp:TemplateField>
代码C#
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DateTime date1 = Convert.ToDateTime(DataBinder.Eval(e.Row.DataItem, "IPMaturity"));
if (date1 >= DateTime.Now)
e.Row.Cells[4].BackColor = System.Drawing.Color.White;
if (date1 < DateTime.Now)
e.Row.Cells[4].BackColor = System.Drawing.Color.Red;
}
}
您可能正在寻找一个可为null的DateTime:DateTime?
System.DateTime
类型是值类型,因此不允许为null。Nullable
类允许将值设置为null
。
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string ipMaturity = DataBinder.Eval(e.Row.DataItem, "IPMaturity");
DateTime? date1 = !string.IsNullOrEmpty(ipMaturity) ? Convert.ToDateTime(ipMaturity) : (DateTime?)null;
if (date1.HasValue && date1 >= DateTime.Now)
e.Row.Cells[4].BackColor = System.Drawing.Color.White;
if (date1.HasValue && date1 < DateTime.Now)
e.Row.Cells[4].BackColor = System.Drawing.Color.Red;
}
}
既然我们使用了可为null的DateTime
,那么if
语句将被更新以检查null
,从而在提供值之前避免设置背景色。
我对DataBinder.Eval
不太熟悉,所以如果没有返回string
,我很抱歉,但希望DateTime?
能让你朝着正确的方向前进。
如果需要将null
保存为数据库中的值,则数据库中的字段也需要为null。
我没有必要的项目来测试它,但我认为If
语句测试它的null
会起作用。如果这不起作用,我会使用try/catch
,我也把它放在下面。如果你知道正在抛出的异常,那么抓住它就太好了。
如果代码:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.DataItem != null)
{
DateTime date1 = Convert.ToDateTime(DataBinder.Eval(e.Row.DataItem, "IPMaturity"));
if (date1 >= DateTime.Now)
e.Row.Cells[4].BackColor = System.Drawing.Color.White;
if (date1 < DateTime.Now)
e.Row.Cells[4].BackColor = System.Drawing.Color.Red;
}else
{
// Data was null, so do something?
}
}
}
Try/Catch代码:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DateTime date1 = Convert.ToDateTime(DataBinder.Eval(e.Row.DataItem, "IPMaturity"));
if (date1 >= DateTime.Now)
e.Row.Cells[4].BackColor = System.Drawing.Color.White;
if (date1 < DateTime.Now)
e.Row.Cells[4].BackColor = System.Drawing.Color.Red;
}
}
catch
{
// Gracefully handle the exception here
}
}