Я пытаюсь изменить цвет строки gridview, если она прошла мимо текущей даты. Я огляделся и задумался над тем, что кажется, что он должен работать. Однако это не так. Зачем?
Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта.
Ошибка источника:
Строка 114: {Строка 115:
Строка 116: DateTime dt = Convert.ToDateTime(((DataRowView) e.Row.DataItem) ["ExpiryDate"]); Строка 117: строка Test = DateTime.Compare(DateTime.Now, dt).ToString(); Строка 118:
Вот мой код
protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
{
DateTime dt = Convert.ToDateTime(((DataRowView)e.Row.DataItem)["ExpiryDate"]);
string Test = DateTime.Compare(DateTime.Now,dt).ToString();
if (Test == "0")
{
e.Row.BackColor = System.Drawing.Color.Red;
}
else
{
e.Row.BackColor = System.Drawing.Color.White;
}
}
Вы можете проверить некоторые объекты и использовать некоторые безопасные броски, чтобы проверить, все ли в порядке, прежде чем использовать его.
Преобразование может быть выполнено с использованием формата даты, для образца dd/MM/yyyy
или mm/DD/yyyy
и попытаться извлечь дату DateTime.TryParseExact
. Я не уверен в вашем формате даты, но вы можете попробовать что-то вроде этого (посмотрите комментарии):
private CultureInfo enUS = new CultureInfo("en-US");
protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
{
// check if it is a row that contains data
if (e.Row.RowType == DataControlRowType.DataRow)
{
// convert the dataItem to your datasource type with a safe cast
DataRowView row = e.Row.DataItem as DataRowView;
// check if the conversion was succeed
if (row != null)
{
// check if the date column is not null
if (row["ExpiryDate"] != null)
{
// try to convert the string into a datetime with a specific format (i am not sure about the date format you are using)
DateTime dt;
if (DateTime.TryParseExact(row["ExpiryDate"], "mm/DD/yyyy", enUS, DateTimeStyles.None, out dt))
{
// conversion looks ok, do your task
int compareResult = DateTime.Compare(DateTime.Now, dt);
e.Row.BackColor = compareResult == 0 ? System.Drawing.Color.Red : System.Drawing.Color.White;
}
}
}
}
}
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
onrowdatabound="GridView1_RowDataBound" >
<Columns>
<asp:TemplateField HeaderText="ExpiryDate">
<ItemTemplate>
<asp:Label ID="lblExpiryDate" runat="server"
Text='<%# DataBinder.Eval(Container, "DataItem.ExpiryDate") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
......
</Columns>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string v_ExpiryDate = (string)DataBinder.Eval(e.Row.DataItem, "ExpiryDate");
string Test = DateTime.Compare(DateTime.Now,Convert.ToDateTime(v_ExpiryDate)).ToString();
if (Test == "0")
{
e.Row.BackColor = System.Drawing.Color.Red;
}
else
{
e.Row.BackColor = System.Drawing.Color.White;
}
}
}
Благодаря
Асим Чаттерджи
rowtype
в начале обработчика события -if(e.Row.RowType == DataControlRowType.DataRow)