Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
MS SQL

Выделяем цветом неполные строки

07.10.2015, 11:46. Показов 2422. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
У меня есть DataGridView, которому в DataSource
C#
1
DGV_JournalStatements.DataSource = dt.AsDataView();
кладу DataTable из БД
C#
1
DataTable dt = new DataTable();
Хочу выделить цветом строки, в которых не все ячейки заполнены (прописал в функцию)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void PaintLines()   //красит не полные и полные строки (красным и зелёным соответственно)
        {
            {
                for (int i = 0; i < DGV_JournalStatements.Rows.Count; i++)  //по строке
                {
                    for (int j = 0; j < DGV_JournalStatements.ColumnCount; j++) //по столбцу
                    {
                        if
                            (DGV_JournalStatements.CurrentRow.Cells[j].Value == null) //Ошибка "Ссылка на объект не указывает на экземпляр объекта."
                        {
                            DGV_JournalStatements.Rows[i].Cells[j].Style.BackColor = Color.Red; //красим всю строку красным
                        }
                        else
                        {
                            DGV_JournalStatements.Rows[i].Cells[j].Style.BackColor = Color.Green;   //красим всю строку зелёным
                        }
                    }
                }
            }
            DGV_JournalStatements.DataSource = dt.AsDataView();
        }
Эту функцию вызываю после запроса из БД к DataGridView
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
            /*Раньше сюда кидало "Ссылка на объект не указывает на экземпляр объекта." исправил модификацией SQL запроса с помощью дополнительных алиасов на таблицы*/
            dt = QueriesRun.RunSelectQueryStudentInfo("SELECT StatementID, StatementNumber, (CASE FlagMain WHEN 8 THEN 'Основная' WHEN 5 THEN 'На пять' WHEN 1 THEN 'На одного' END),"
            + " s.Name + ' ' + s.LastName + ' ' + s.FatherName, DateCreate, MarkValue, AcademHours, d.FIO, e.FIO, f.FIO, WorkLPSubjects.WorkLPSubjectID,"
 
            + " (SELECT COUNT(StudentID) FROM Statement AS a WHERE a.StatementNumber = b.StatementNumber)"
            + " FROM [Statement] AS b"
 
            + " JOIN WorkLPSubjects ON b.WorkLPSubjectID = WorkLPSubjects.WorkLPSubjectID JOIN BaseLearningPlan ON WorkLPSubjects.BaseLearningPlanID = BaseLearningPlan.BaseLearningPlanID"
            + " JOIN SpecialtyInfo ON BaseLearningPlan.SpecialtyID = SpecialtyInfo.specialtyID JOIN FacultyInfo ON SpecialtyInfo.FacultyID = FacultyInfo.FacultyID"
            + " JOIN UsersBD ON FacultyInfo.FacultyID = UsersBD.FacultID"
 
            + " LEFT OUTER JOIN StudentInfo as s ON b.StudentID = s.StudentID"
 
            + " LEFT OUTER JOIN TeacherInfo as d ON b.teacher1ID = d.TeacherID"
            + " LEFT OUTER JOIN TeacherInfo as e ON b.teacher2ID = e.TeacherID"
            + " LEFT OUTER JOIN TeacherInfo as f ON b.teacher3ID = f.TeacherID"
 
            + " WHERE UsersID = " + UserID + ""
            + " GROUP BY StatementID, StatementNumber, (CASE FlagMain WHEN 8 THEN 'Основная' WHEN 5 THEN 'На пять' WHEN 1 THEN 'На одного' END),"
            + " s.Name + ' ' + s.LastName + ' ' + s.FatherName, DateCreate, MarkValue, AcademHours, d.FIO, e.FIO, f.FIO, WorkLPSubjects.WorkLPSubjectID");
 
            PaintLines();
 
            DGV_JournalStatements.DataSource = dt.AsDataView();
            #endregion
Но кидает исключительную ситуацию: "Ссылка на объект не указывает на экземпляр объекта", скорее всего нулевое значение где-то...
С отладчиком я на "Ваше величество", подскажите пожалуйста, что мне делать?
Благодарю за внимание!
Миниатюры
Выделяем цветом неполные строки  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2015, 11:46
Ответы с готовыми решениями:

Если $i делится на 2 то выделяем строку цветом aqua, а если на 3 - то курсивом
Как сделать так, чтобы 6 тоже был курсив?Так как он делится на 2 и на 3. Условие: если $i делится на 2 то выделяем строку цветом aqua, а...

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

Динамические массивы: выделяем и высвобождаем память
Доброго времени суток! Динамические массивы: выделяем и высвобождаем память. Но сложность в том, что после выполнения delete, память...

14
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
07.10.2015, 12:22
C#
1
2
3
4
5
6
7
foreach (DataGridViewRow row in this.dataGridView1.Rows)
{                            
    foreach (DataGridViewCell cell in row.Cells)
{
...
}
}
А CurrentRow всегда возвращает текущую строку.
1
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
07.10.2015, 12:43  [ТС]
Уважаемый,
Я дико извиняюсь за свой идиотизм (в программировании я не так давно, уж простите), но попробовав ваш подход
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        private void PaintLines()   //красит не полные и полные строки (красным и зелёным соответственно)
        {
            {
                int i = 0;
                int j = 0;
                foreach (DataGridViewRow row in this.DGV_JournalStatements.Rows)
                {
                    foreach (DataGridViewCell cell in row.Cells)
                    {
                        if
                            (DGV_JournalStatements.Rows[i].Cells[j].Value == null) //Ошибка "Ссылка на объект не указывает на экземпляр объекта."
                        {
                            DGV_JournalStatements.Rows[i].Cells[j].Style.BackColor = Color.Red; //красим всю строку красным
                        }
                        else
                        {
                            DGV_JournalStatements.Rows[i].Cells[j].Style.BackColor = Color.Green;   //красим всю строку зелёным
                        }
                    }
                }
            }
            DGV_JournalStatements.DataSource = dt.AsDataView();
        }
ничего не выделилось, загрузилось как будто функцию эту вовсе не использую, хотя судя по коду всё в порядке, описываю функцию и вызываю в нужном месте.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
07.10.2015, 12:51
Цитата Сообщение от Demonikaliysis Посмотреть сообщение
загрузилось как будто функцию эту вовсе не использую
Так и есть. Сначала привязка данных должна идти, потом вызов PaintLines().

C#
1
2
DGV_JournalStatements.DataSource = dt.AsDataView();
PaintLines();
1
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
07.10.2015, 13:08  [ТС]
Ставлю в форме вывода, сразу же после запроса, как вы писали
C#
1
2
DGV_JournalStatements.DataSource = dt.AsDataView();
PaintLines();
и все равно ничего не выделяет.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
07.10.2015, 16:25
в foreach не нужны индексаторы.
C#
1
2
3
4
5
6
7
8
foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                foreach (DataGridViewCell cell in row.Cells)
                {
                    if (cell.Value != null)
                        cell.Style.BackColor = Color.Red;
                }
            }
1
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
07.10.2015, 16:50  [ТС]
Я думал что в условии цикла что-то не верно указал, но не смог понять как записать по-другому с foreach никогда не работал, погуглил, но как сделать вложенность второго цикла для условия так и не понял.
Сделал по-вашему, тоже самое.
Привязываю данные, вызываю функцию после запроса выборки для загрузки данных на форму, всё тщетно? Ничего не выделяется
Он попросту ничего не выделяет, что с ним что без него результат один и тот же.

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
namespace ...
{
    public partial class formJournalStatements : Form
...
        public formJournalStatements(int user, SqlConnectionStringBuilder sqlbuild)
    {
...
PaintLines();
    }
...
        public void LoadJournalStatements()
        {
            dt = QueriesRun.RunSelectQueryStudentInfo("SELECT StatementID, StatementNumber, (CASE FlagMain WHEN 8 THEN 'Основная' WHEN 5 THEN 'На пять' WHEN 1 THEN 'На одного' END),"
            + " s.Name + ' ' + s.LastName + ' ' + s.FatherName, DateCreate, MarkValue, AcademHours, d.FIO, e.FIO, f.FIO, WorkLPSubjects.WorkLPSubjectID,"
 
            + " (SELECT COUNT(StudentID) FROM Statement AS a WHERE a.StatementNumber = b.StatementNumber)"
            + " FROM [Statement] AS b"
 
            + " JOIN WorkLPSubjects ON b.WorkLPSubjectID = WorkLPSubjects.WorkLPSubjectID JOIN BaseLearningPlan ON WorkLPSubjects.BaseLearningPlanID = BaseLearningPlan.BaseLearningPlanID"
            + " JOIN SpecialtyInfo ON BaseLearningPlan.SpecialtyID = SpecialtyInfo.specialtyID JOIN FacultyInfo ON SpecialtyInfo.FacultyID = FacultyInfo.FacultyID"
            + " JOIN UsersBD ON FacultyInfo.FacultyID = UsersBD.FacultID"
 
            + " LEFT OUTER JOIN StudentInfo as s ON b.StudentID = s.StudentID"
 
            + " LEFT OUTER JOIN TeacherInfo as d ON b.teacher1ID = d.TeacherID"
            + " LEFT OUTER JOIN TeacherInfo as e ON b.teacher2ID = e.TeacherID"
            + " LEFT OUTER JOIN TeacherInfo as f ON b.teacher3ID = f.TeacherID"
 
            + " WHERE UsersID = " + UserID + ""
            + " GROUP BY StatementID, StatementNumber, (CASE FlagMain WHEN 8 THEN 'Основная' WHEN 5 THEN 'На пять' WHEN 1 THEN 'На одного' END),"
            + " s.Name + ' ' + s.LastName + ' ' + s.FatherName, DateCreate, MarkValue, AcademHours, d.FIO, e.FIO, f.FIO, WorkLPSubjects.WorkLPSubjectID");
 
            DGV_JournalStatements.DataSource = dt.AsDataView();
 
            PaintLines();
         }
...
        private void PaintLines()
        {
            foreach (DataGridViewRow row in DGV_JournalStatements.Rows)
            {
                foreach (DataGridViewCell cell in row.Cells)
                {
                    if (cell.Value != null)
                        cell.Style.BackColor = Color.Red;
                }
            }
         }
...
}
0
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
09.10.2015, 12:06  [ТС]
Прошу прощения не правильно выразился, он не выделяет только при загрузке самой формы и при сортировке по любому столбцу таблицы при нажатии мышью.

Добавлено через 26 минут
И ещё он красит все строки не различая сколько в строке есть заполненных и не заполненных ячеек, не получается сделать рабочее условие.
0
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
12.10.2015, 11:41  [ТС]
Немного потупив, нашёл в обработчике событий формы, адекватную по работе функцию Shown(). Теперь работает окрашивание при загрузке формы.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
12.10.2015, 19:51
Обрабатывайте событие CellFormatting.
C#
1
2
3
4
5
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
   {
            if (e.Value.GetType().FullName != "System.DBNull")
                 e.CellStyle.BackColor = Color.Red;
   }
1
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
14.10.2015, 12:55  [ТС]
Спасибо за такой подход, не знал о нём. Весьма интересен.

1. Конечно работает и таким образом тоже, но всё же нужно выделять всю строку, если она содержит пустые ячейки, а не только пустую ячейку. В Intellisence не нашёл ничего для строки для вашего подхода в данной ситуации.

2. Нужно выделять строки если содержат пустые ячейки одни цветом, а если все строки полные, то другим. Получилось только через 2 цикла с условиями, в один с условием
C#
1
2
3
4
5
6
7
8
9
10
            for (int i = 0; i < DGV_JournalStatements.ColumnCount; i++)
            {
                for (int j = 0; j < DGV_JournalStatements.RowCount; j++)
                {
                    if (DGV_JournalStatements.Rows[j].Cells[i].Value.ToString() != "")
                    { DGV_JournalStatements.Rows[j].DefaultCellStyle.BackColor = Color.YellowGreen; }
                    else
                        DGV_JournalStatements.Rows[j].DefaultCellStyle.BackColor = Color.Silver;
                }
            }
не красит

3. Ваше условия допустимо только для события CellFormatting, а есть ещё события например покраски на сортировку по столбцам по нажатию кнопки мыши и некоторые иные.

Пока решил вопрос так:
Прописал в тело функции следующий код и вызываю функцию там где это необходимо
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
        #region _Выделение цветом не полных и полных строк
        private void PaintLines()
        {
            DGV_JournalStatements.DataSource = dt.AsDataView();
 
            #region _Заполненные ведомости
            for (int i = 0; i < DGV_JournalStatements.ColumnCount; i++)
            {
                for (int j = 0; j < DGV_JournalStatements.RowCount; j++)
                {
                    if (DGV_JournalStatements.Rows[j].Cells[i].Value.ToString() != "")
                        DGV_JournalStatements.Rows[j].DefaultCellStyle.BackColor = Color.YellowGreen;
                }
            }
            #endregion
 
            #region _Не заполненные ведомости
            for (int i = 0; i < DGV_JournalStatements.ColumnCount; i++)
            {
                for (int j = 0; j < DGV_JournalStatements.RowCount; j++)
                {
                    if (DGV_JournalStatements.Rows[j].Cells[i].Value.ToString() == "")
                        DGV_JournalStatements.Rows[j].DefaultCellStyle.BackColor = Color.Silver;
                }
            }
            #endregion
        }
 
        #endregion
Можно его как-то улучшить? Например чтобы покрасилось и потом не перекрашивалось всё заново, потомучто новый запрос на какую-то выборку в датагрид, перекрашивает всю таблицу заново.

Добавлено через 12 минут
Без покраски оно всё работает почти мгновенно, а вот с раскрашиванием строк бывает и до пол секунды задержка, как от неё избавиться?
Например чтобы при загрузке формы покрасилось, и потом не перекрашивалось.
Сейчас окраска идёт отдельной процедурой и вызываться там где она нужна.Из-за этого в работе наблюдаются задержки.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
14.10.2015, 13:17
Цитата Сообщение от Demonikaliysis Посмотреть сообщение
но всё же нужно выделять всю строку, если она содержит пустые ячейки, а не только пустую ячейку
С этого нужно было начинать. Ведь в приведенном выше коде вы везде раскрашивали ячейки.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            for (int i = 0; i < DGV_JournalStatements.ColumnCount; i++)
            {
                for (int j = 0; j < DGV_JournalStatements.RowCount; j++)
                {
                    if (DGV_JournalStatements.Rows[j].Cells[i].Value.ToString() != "")
                    { DGV_JournalStatements.Rows[j].DefaultCellStyle.BackColor = Color.YellowGreen; }
                    else
                     {
                        DGV_JournalStatements.Rows[j].DefaultCellStyle.BackColor = Color.Silver;
                        break;
                     }
                }
            }
0
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
14.10.2015, 15:06  [ТС]
Я пробовал такое ранее и все возможные варианты в условиях использовал знакомые мне, не работает (красит всё в первый попавшийся цвет по ходу строк кода), даже в else указал проверку условия.
C#
1
2
3
4
5
6
7
                    if (DGV_JournalStatements.Rows[j].Cells[i].Value.ToString() != "")
                    { DGV_JournalStatements.Rows[j].DefaultCellStyle.BackColor = Color.Silver; }
                    else
                    {
                        if (DGV_JournalStatements.Rows[j].Cells[i].Value.ToString() == "")
                        { DGV_JournalStatements.Rows[j].DefaultCellStyle.BackColor = Color.YellowGreen; }
                        break;
Ставил точку останова, он входит в оба цвета и итераторы меняются, но не красит как надо если одним циклом, только двумя и никак иначе.

Можно ли как-то избавиться от "перекраски", когда закрашено, чтобы не проверял снова теже данные и не перекрашивал их в тот же цвет, это ведь рудимент.

Добавлено через 6 минут
Хоть и ячейки грида создаются заново, быть может можно их как-то не уничтожать если они уже покрашены?
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
14.10.2015, 15:16
Цитата Сообщение от Demonikaliysis Посмотреть сообщение
красит всё в первый попавшийся цвет по ходу строк кода
Поменяйте циклы. Сначала должен идти по строкам, а потом по столбцам.
1
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
14.10.2015, 15:38  [ТС]
Поменял, сработало, и как я это просмотрел...спасибо большое!

Можно ли сделать покраску пошустрее? Там около секунды задержка, без покраски почти мгновенно всё хоть и данных всего то тысяч 17 строк.

Добавлено через 19 минут
Использовал конструктор формы для построения грида с выводом представления как источника данных из БД. Уже получше примерно в 2 раза если на глаз. Попробую таймер добавить, для точности получаемых результатов, но всё же нет иной возможности?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.10.2015, 15:38
Помогаю со студенческими работами здесь

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

Написать программу разрешающую ввод строки не более 80 символов и вывод на экран этой строки красным цветом
Ассемблер. Написать программу разрешающую ввод строки не более 80 символов и вывод на экран этой строки красным цветом

Запрос на неполные семьи
Здравствуйте! Мне нужна ваша помощь сделать такое: От меня требуется написать запрос, определяющий детей, которые воспитываются в...

Неполные данные с POST
отправляю обычным способом данные $data=&quot;tx=&quot;.$text; $fp = fsockopen(&quot;test.ru&quot;, 80, $errno, $errstr, 10); $out = &quot;POST...

Неполные наборы инструментов в CS6
Здравствуйте! У меня установлен фотошоп CS6 русская версия и почему-то нет всех инструментов группы &quot;Перо&quot; и работы с контуром (в...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru