Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/22: Рейтинг темы: голосов - 22, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23

Задать стиль для области DataGridView

08.10.2013, 09:59. Показов 4535. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!
Вопрос по DataGridView (dgvDoc)
Размер dgvDoc 19 колонок и 1622 строк (30818 ячеек)
Заполнение данными из БД происходит приемлимое время (менее 2 сек.)
Когда устанавливаю FontStyle (шрифт, размер, стиль, выравнивание) время увеличивается до 40 сек.
Шрифт, размер, стиль, выравнивание - эти параметры записаны в БД.
Понятно, что сие происходит из-за перебора ячеек и установки стиля для каждой.
При этом есть 2 области (17685 ячеек и 12918 ячеек) внутри которых стили одинаковые.
Отсюда вопрос
Как задать стиль для области dgvDoc (не перебором ячеек)
Пробовал dgvDoc.SelectedCells, но там нельзя установить стиль.
foreach (DataGridViewCell dvc in dgvDoc.SelectedCells) - тот же перебор
Вот кусок кода
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
                        while (lReader.Read())
                        {
                            lFStyle = FontStyle.Regular;
                            if (lReader["is_bold"].ToString() == "Y")
                                lFStyle = lFStyle | FontStyle.Bold;
                            if (lReader["is_italic"].ToString() == "Y")
                                lFStyle = lFStyle | FontStyle.Italic;
                            if (lReader["is_underline"].ToString() == "Y")
                                lFStyle = lFStyle | FontStyle.Underline;
 
                            lAlig = DataGridViewContentAlignment.NotSet;
                            if (lReader["vertical_alignment"].ToString() == "CENTER" & lReader["horizontal_alignment"].ToString() == "CENTER")
                                lAlig = DataGridViewContentAlignment.MiddleCenter;
                            if (lReader["vertical_alignment"].ToString() == "CENTER" & lReader["horizontal_alignment"].ToString() == "LEFT")
                                lAlig = DataGridViewContentAlignment.MiddleLeft;
                            if (lReader["vertical_alignment"].ToString() == "CENTER" & lReader["horizontal_alignment"].ToString() == "RIGHT")
                                lAlig = DataGridViewContentAlignment.MiddleRight;
 
                            if (lReader["vertical_alignment"].ToString() == "TOP" & lReader["horizontal_alignment"].ToString() == "CENTER")
                                lAlig = DataGridViewContentAlignment.TopCenter;
                            if (lReader["vertical_alignment"].ToString() == "TOP" & lReader["horizontal_alignment"].ToString() == "LEFT")
                                lAlig = DataGridViewContentAlignment.TopLeft;
                            if (lReader["vertical_alignment"].ToString() == "TOP" & lReader["horizontal_alignment"].ToString() == "RIGHT")
                                lAlig = DataGridViewContentAlignment.TopRight;
 
                            if (lReader["vertical_alignment"].ToString() == "BOTTOM" & lReader["horizontal_alignment"].ToString() == "CENTER")
                                lAlig = DataGridViewContentAlignment.BottomCenter;
                            if (lReader["vertical_alignment"].ToString() == "BOTTOM" & lReader["horizontal_alignment"].ToString() == "LEFT")
                                lAlig = DataGridViewContentAlignment.BottomLeft;
                            if (lReader["vertical_alignment"].ToString() == "BOTTOM" & lReader["horizontal_alignment"].ToString() == "RIGHT")
                                lAlig = DataGridViewContentAlignment.BottomRight;
 
                            iRow = Convert.ToInt32(lReader["cell_row"].ToString()) - 1;
                            lNameCol = "Col_" + lReader["cell_column"].ToString();
                            dgvDoc.Rows[iRow].Cells[lNameCol].Style.Font = new Font(lReader["font_name"].ToString(),
                                                                                    Convert.ToSingle(lReader["font_size"].ToString()),
                                                                                    lFStyle);
                            dgvDoc.Rows[iRow].Cells[lNameCol].Style.ForeColor = System.Drawing.ColorTranslator.FromHtml("#" + lReader["foreground_color"].ToString());
                            dgvDoc.Rows[iRow].Cells[lNameCol].Style.BackColor = System.Drawing.ColorTranslator.FromHtml("#" + lReader["background_color"].ToString());
                            dgvDoc.Rows[iRow].Cells[lNameCol].Style.Alignment = lAlig;
 
                            if (!String.IsNullOrEmpty(lReader["cell_value"].ToString()))
                                dgvDoc.Rows[iRow].Cells[lNameCol].Value = lReader["cell_value"].ToString();
 
                            if (!String.IsNullOrEmpty(lReader["merged_columns"].ToString()))
                            {
                                cell = (DataGridViewTextBoxCellEx)dgvDoc[lNameCol, iRow];
                                cell.ColumnSpan = Convert.ToInt32(lReader["merged_columns"].ToString());
                                cell.RowSpan = Convert.ToInt32(lReader["merged_rows"].ToString());
                            }
                        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.10.2013, 09:59
Ответы с готовыми решениями:

Как задать новый стиль для тега, у которого уже есть стиль
Привет всем. У меня есть вот такая запись в таблице стилей #c_menu li{ list-style:none; padding: 5px 0px; border-bottom: 1px solid...

Задать стиль для @Html.ValidationMessageFor
Подскажите, пожалуйста, как можно прописать стили для валидаторов? А то приходится каждый раз оформлять их в <span>. Спасибо

Задать стиль для определенной таблицы
Здравствуйте! Задал стиль для таблицы, меню тоже берет тот стиль и все выглядит каляки маляки, как можно задать стиль для...

20
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.10.2013, 10:06
NickAssa, снижение производительности связано с дики количеством операций сравнения, а не с изменением стиля. Я только не понял, ты что для каждой ячейки хранишь с каким стилем она должна отображаться?
0
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23
08.10.2013, 11:16  [ТС]
База досталась по наследству и там действительно стиль хранится для каждой ячейки.
Попробую снизить количество сравнений - отпишу результат.

Добавлено через 57 минут
Получилось вот что
Если оставить только заполнение данными, то отрисовка происходит за 1.6 сек.
C#
1
2
3
4
5
6
7
while (lReader.Read())
{
    iRow = Convert.ToInt32(lReader["cell_row"].ToString()) - 1;
    lNameCol = "Col_" + lReader["cell_column"].ToString();
    if (!String.IsNullOrEmpty(lReader["cell_value"].ToString()))
        dgvDoc.Rows[iRow].Cells[lNameCol].Value = lReader["cell_value"].ToString();
}
Пробовал добавить все операции сравнения (код в первом сообщении) - время увеличилось, но не критично (с 1.6 до 1.9 сек)

А вот как только добавляю установку стилей время увеличивается до 52 сек.
C#
1
2
3
4
5
6
7
8
9
while (lReader.Read())
{
    iRow = Convert.ToInt32(lReader["cell_row"].ToString()) - 1;
    lNameCol = "Col_" + lReader["cell_column"].ToString();
    dgvDoc.Rows[iRow].Cells[lNameCol].Style.Font = new Font("Arial Narrow", 10F, FontStyle.Underline);                                                                                
    dgvDoc.Rows[iRow].Cells[lNameCol].Style.Alignment = DataGridViewContentAlignment.BottomRight;
    if (!String.IsNullOrEmpty(lReader["cell_value"].ToString()))
        dgvDoc.Rows[iRow].Cells[lNameCol].Value = lReader["cell_value"].ToString();
}
Т.е. дело видимо не в сравнениях.
Поэтому вопрос остается
Как задать стиль для области dgvDoc (не перебором ячеек)
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.10.2013, 11:19
а есть какой-то признак, по которому ячейки объединяются в группы?

Добавлено через 2 минуты
Цитата Сообщение от NickAssa Посмотреть сообщение
дело видимо не в сравнениях
попробуй задавать дефолтный стиль ячейки для группы до того, как эта группа начнет создаваться
0
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23
08.10.2013, 11:27  [ТС]
Явного признака нет. Просто в таблице есть поле с кодом колонки и кодом строки. И те 2 области, про которые я писал (17685 ячеек и 12918 ячеек) состоят из ячеек, которые образуют сплошной прямоугольник.

Про дефолтный стиль думал, но это позволит сократить время примерно в 2 раза (области почти одинаковые).
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.10.2013, 12:20
NickAssa, область предполагает изменение всей строки или только её часть?
0
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23
08.10.2013, 12:23  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
NickAssa, область предполагает изменение всей строки или только её часть?
Только часть строк
Область выглядит так [rowStart][colStart]:[rowEnd][colEnd]
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
08.10.2013, 12:25
В каком событие происходит форматирование?
0
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23
08.10.2013, 12:33  [ТС]
Заполнение и форматирование выделено в отдельный метод, который запускается по событию Load формы
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
08.10.2013, 12:36
Перенесите форматирование в CellFormatting событие.
0
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23
08.10.2013, 12:49  [ТС]
Не понял идею
Событие CellFormatting происходит, когда нужно изменить представление ячейки.
Т.е. мне придется вызывать это событие из того же цикла и изменять стиль ячейки [e.ColumnIndex][e.RowIndex]
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
08.10.2013, 13:02
Т.е. событие будет происходить когда ячейка будет выводиться, и вы для нее будете задавать стиль. Если я не ошибаюсь событие будет возникать только для тех ячеек, которые нужно прорисовать в текущий момент, а не все 1600.
0
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23
08.10.2013, 13:26  [ТС]
Т.е. если сразу на экране выводится только 100 строк, то изменить стиль нужно только для них.
После движения, например скролла вниз, отрисуется еще десяток строк и форматировать нужно их.
Я правильно понял?
Тогда, наверное, логично сразу записать все параметры стиля всех ячеек в tag каждой ячейки.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
08.10.2013, 14:40
Тогда, наверное, логично сразу записать все параметры стиля всех ячеек в tag каждой ячейки.
покажите структуру строки, которую вы получаете из таблицы.
на сколько я понял, то у вас что-то в этом виде:
1 | 5 | lol | style | color | merged|
тобиш в строке хранятся данные стиля.

Если это так, то у вас уже все есть.
в tag каждой ячейки.
а вот это настораживает, вы что пихаете все в контрол, не используя привязки к источнику?

и еще совет, для того чтобы уменьшть "дрожание/мерцание" при скролинге используйте это вместо DataGridView:
C#
1
2
3
4
5
6
7
public class DataGridViewEx : DataGridView
{
    public DataGridViewEx()
    {
        this.DoubleBuffered = true;
    }
}
1
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23
08.10.2013, 14:55  [ТС]
Цитата Сообщение от Konctantin Посмотреть сообщение
покажите структуру строки, которую вы получаете из таблицы.
на сколько я понял, то у вас что-то в этом виде:
1 | 5 | lol | style | color | merged|
тобиш в строке хранятся данные стиля.
Вот строка
cell_column
,cell_row
,merged_columns
,merged_rows
,column_width
,row_height
,cell_value
,format_mask
,font_name
,font_size
,is_bold
,is_italic
,is_underline
,foreground_color
,background_color
,horizontal_alignment
,vertical_alignment
,top_border
,bottom_border
,left_border
,right_border
Т.е. хранятся "куски" стиля для каждой ячейки.
а вот это настораживает, вы что пихаете все в контрол, не используя привязки к источнику?
Я считываю данные из таблицы вот так
C#
1
2
3
4
5
6
7
8
9
using (OracleConnection lCnt = new OracleConnection(Program.ConnectionString))
{
    lCnt.Open();
    OracleDataReader lReader;
    lReader = Program.OracleSQLExec(lCnt, lCmdCol);
    if (lReader != null)
    {
        while (lReader.Read())
            {...
Вы предлагаете в нужный момент читать данные?
Боюсь, что это сильно замедлит работу.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
08.10.2013, 15:01
Вы предлагаете в нужный момент читать данные?
нет, я этого не предлагаю, и даже против.

итак давайте дальше догадываться:
В таблице вы храните стиль, а потом просто формируете "полотно", а данные, что с ними?

Если вам не сложно, покажите что у вас получается на экране скриншотом, если конечно это возможно.
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
08.10.2013, 15:01
Цитата Сообщение от NickAssa Посмотреть сообщение
Вы предлагаете в нужный момент читать данные?
Именно. CellFormatting это и делает. Вполне возможно, что пользователь вообще продпочтет не смотреть все данные. А в CellFormatting вы сможете форматировать свои ячейки порциями, и тормоза будут не так заметны.
1
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
08.10.2013, 15:07
исходя из всего этого, я поступил бы следующим образом:
Данные ячеек вынес бы в отдельную DataTable а стиль бы хранил в исходной.
К гриду привязал бы таблицу с данными, а в событии CellFormatting получал бы стиль и применял бы его к данной ячейке.

ЗЫ. для ускорения работы с таблицей стилей я бы хранил ее как Dictionary<Key, Value>
0
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23
08.10.2013, 15:25  [ТС]
Во вложении скрин DataGrid'а

В таблице вы храните стиль, а потом просто формируете "полотно", а данные, что с ними?
Читаю в том же цикле
C#
1
2
if (!String.IsNullOrEmpty(lReader["cell_value"].ToString()))
    dgvDoc.Rows[iRow].Cells[lNameCol].Value = lReader["cell_value"].ToString();
Миниатюры
Задать стиль для области DataGridView  
0
2 / 2 / 0
Регистрация: 24.08.2012
Сообщений: 23
10.10.2013, 12:51  [ТС]
Пошел другим путем - организовал второй поток
В основном загружаю 50 строк (~1 сек.)
А в делегате заполняю все остальное.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.10.2013, 12:51
Помогаю со студенческими работами здесь

Задать отдельный стиль для Mozilla
Здравствуйте. У меня на странице имеется элемент. Во всех браузерах, кроме Mozilla, данный элемент отображается так-как нужно. В...

Задать стиль текста для всего проекта C#
VS 2010 С#. Можно ли задать определённый шрифт для всех компонентов на форме в проекте?

Задать стиль для кнопки из код бихайнд
Здравствуйте, подскажите, пожалуйста, как сделать и применить стиль для кнопки, которую я создаю в код бихайнд? Нужно задать размер, запрет...

Как задать стиль шрифта для Label в коде?
как задать стиль шрифта для Label в коде. пишу :Form1.LStart.Font.Style := 'Sylfaen', выдает ошибку главное, с размером, цветом вроде та...

Не могу задать стиль для мобильного вида страницы
Привет всем! Друзья, подскажите, как мне задать нормальный внешний вид страницы оформления заказа woocommerce? Проблема вот в чем, при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru