вторник, 4 ноября 2014 г.

Замена пустого места на что-то осмысленное в GridView при отображении NULL-значений.

Может быть, заголовок не передает всей идеи того, о чем я хочу рассказать, так что попробую объяснить ситуацию более подробно. Наверняка, многие из вас сталкивались с чем-то подобным.
Итак, представьте, что у нас в базе данных есть табличка примерно такого вида. Для простоты дальнейшего повествования предлагаю считать, что все поля, кроме id - nullable, так что null может быть где угодно, а не только в поле job.


И мы хотим вывести данные из нее в GridView. По умолчанию у нас получится вот что:

Не красиво, и не очень информативно, согласитесь. Было бы более наглядно, если бы вместо пустого места вместо NULL-значений выводилось что-то более осмысленное и говорящее пользователю об истинном положении вещей.

Сделать это можно двумя способами. Первый способ, для нашей задачи не очень правильный, путем создания обработчика события RowDataBound:



 
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //Нас интересуют только ряды с дынными. Все остальное, например DataControlRowType.Header
            //и DataControlRowType.Footer мы игнорируем.
            if (e.Row.RowType == DataControlRowType.DataRow)
            {             
                for (int i = 0; i < e.Row.Cells.Count; i++)
                {
                    //ячейка, связанное поле которой содержит null в ASP.NET рендерится как неразрывный пробел
                    //то есть, чтобы узнать что ячейка пустая нам надо убрать этот пробел.
                    //Да, если в поле данных содержится обычный пробел, то он и останется обычным пробелом.
                    if (string.IsNullOrEmpty(e.Row.Cells[i].Text.Replace("&nbsp;", string.Empty)))
                    {
                        //ну и заменить содержимое ячейки, на то, что нам нужно.
                        e.Row.Cells[i].Text = "неизвестно";
                    }
                        
                }
            }
        }


Второй же, вариант более правильный. Достаточно декларативно задать в каждом BoundField грида свойство NullDisplayText:

 
        
            
                
                
                
                
            
        

В результате, и в первом, и во втором варианте, мы получим вот такой результат:


И, кстати, NullDisplayText позволяет в качестве замены null-значений задавать не только обычный текст, то и любой HTML.

Комментариев нет:

Отправить комментарий