Добрый день.
Как можно сделать более красивый DataGrid в Terrasoft 3.x
В свойствах объекта DataGridСolumn есть возможность изменить цвет самой колонки, а как поменять шрифт и цвет самого текста, как заглавного, так и вывода?
Нравится
Алексей, в первую очередь нужно уточнить версию софта. При переходе с 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 проверяете три разных поля. Может, для всех условия выполнились? Если оставить одно, тоже весь ряд закрасится? Не смотрели в отладке, как отработало?