Вопрос

Красивый DataGrid

Добрый день.

Как можно сделать более красивый DataGrid в Terrasoft 3.x 

В свойствах объекта DataGridСolumn есть возможность изменить цвет самой колонки, а как поменять шрифт и цвет самого текста, как заглавного, так и вывода?

Нравится

7 комментариев

Алексей, в первую очередь нужно уточнить версию софта. При переходе с 3.4.0 на 3.4.1 было добавлено много возможностей со шрифтами. Проверьте, может, получится и то, что хотите.

Если же делать что-то совсем нестандартное, может подойти компонент веб-браузера и программное создание HTML-файла. Именно так для продавцов квартир делалась «шахматка» — схема дома с проданными и непроданными квартирами разных цветов с возможностью открыть карточку квартиры по гиперссылке.

У меня 3.4.0.

 

Нашел пример кода и решил подделать под свою задачу, но не получается:

function grdDataOnGetCellDrawInfo(DataGrid, Column, Color) {
    var DataFieldValue = gvData.Items('colstopgvData').DataField.Value;
    if (!IsEmptyValue(DataFieldValue)) {
        Color.Value = clRed;
    };
}

Мне кажется, это код для цвета фона, а не шрифта.

Зверев Александр,

Не подскажете, как обратиться к объекту colstopgvData, чтобы задать ему нужный цвет шрифт и форму. Разрисовать любую ячейку.

Во всех примерах доработок меняют только фон. Вы можете поставить точку остановки и посмотреть в отладчике, какие там вообще есть свойства в момент отработки этой функции.

Нечто получилось, но не то что хотел.

1. Включил в DataGrid два свойства: HasCustomCellDraw и HasCustomDraw. В противном случае, рисовать ничего в DataGrid не будет.

2. Добавил обработку события OnGetCellDrawInfo снабдив его функцией, где gvData - IDataGridView, а is_day - DataFieldName одной из IDataGridColumn:

function grdDataOnGetCellDrawInfo(DataGrid, Column, Color) {
    try {
        if(gvData.Items(Column).DataFieldName == 'is_block' || gvData.Items(Column).DataFieldName == 'is_day' || gvData.Items(Column).DataFieldName == 'is_stop') {       
            var DataFieldValue = gvData.Items(Column).DataField.Value;
            if (!IsEmptyValue(DataFieldValue) && DataFieldValue!=' '){
                Color.Value = clYellow;
            }
        }    
    } catch(E) {
        Log.Write(mdtError, '[grdDataOnGetCellDrawInfo] ' + E.message+' ['+E.number+']');
    } finally { }    
}

3. Добавил обработку события OnGetCellDrawInfo снабдив его функцией, где dlData - это DataSet, в котором формируются данные  для вывода в DataGrid:

function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) {
    var Dataset = dlData.Dataset;
    var Current = GetFieldValueFromDisabledField(Dataset, 'is_block');
    if (!IsEmptyValue(Current )){
        TextColor.Value = clRed;
    }
    Current = GetFieldValueFromDisabledField(Dataset, 'is_day');
    if (!IsEmptyValue(Current )){
        TextColor.Value = clRed;
    }
    Current = GetFieldValueFromDisabledField(Dataset, 'is_stop');
    if (!IsEmptyValue(Current )){
        TextColor.Value = clRed;
    }
}

 

Итог сей махинации следующий:

Ряд в котором есть заполненное поле в одной из 3 колонок меняет цвет шрифта на красный, а ячейка заполненная данными окрашивается в желтый.

 

Я так и не понял, как поменять цвет нужной ячейки без закрашивания всего ряда.

Не совсем понял, почему Вы для красного цвета в if проверяете три разных поля. Может, для всех условия выполнились? Если оставить одно, тоже весь ряд закрасится? Не смотрели в отладке, как отработало?

Показать все комментарии