Изменить цвет строки вида сетки на основе DateTime.Compare

1

Я пытаюсь изменить цвет строки 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;
    }
}
  • 0
    столбец «ExpiryDate» присутствует в источнике данных, который связан с сеткой? также проверьте свою роль строки в сетке (headerrow, Footerrow и т. д.), если к строке не привязаны действительные данные, она не сможет предоставить объект данных
  • 0
    Я бы добавил проверку типа rowtype в начале обработчика события - if(e.Row.RowType == DataControlRowType.DataRow)
Показать ещё 1 комментарий
Теги:
datetime
gridview

2 ответа

1

Вы можете проверить некоторые объекты и использовать некоторые безопасные броски, чтобы проверить, все ли в порядке, прежде чем использовать его.

Преобразование может быть выполнено с использованием формата даты, для образца 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; 
                }
            }       
        }
    }
}
  • 0
    Привет и спасибо, что вы пишете, имеет смысл, я использую формат MM / DD / YYYY в столбце, хотя он хранится в SQL как Varchar, потому что я не мог избавиться от метки времени на нем, когда я просто хотел дату. Это, вероятно, глупый вопрос, но я получаю без перегрузки метод принимает 4 аргумента, когда я пытаюсь ваш код.
  • 0
    Я отредактировал мой awnser. Я забыл добавить параметр IFormatProvider. В любом случае, вы можете передать null, но если у вас есть специфическая культура, было бы неплохо передать ее. Смотри мои правки.
Показать ещё 1 комментарий
0
<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;
             }
        }

    }

Благодаря

Асим Чаттерджи

Ещё вопросы

Сообщество Overcoder
Наверх
Меню