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

DataGridView - окраска определенных ячеек в определенный цвет при некоторых условиях

01.08.2013, 13:54. Показов 16085. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день.

Имеется вопрос:

Есть программа которая по строчно читает текстовый файл

Код:

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            pBar1.Visible = true;
            // Set Minimum to 1 to represent the first file being copied.
            pBar1.Minimum = 1;
            // Set Maximum to the total number of files to copy.
            pBar1.Maximum = 92000;
            // Set the initial value of the ProgressBar.
            pBar1.Value = 1;
            // Set the Step property to a value of 1 to represent each file being copied.
            pBar1.Step = 1;
 
            Stream mystream = null;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if ((mystream = openFileDialog1.OpenFile()) != null)
                {
                    StreamReader read = new StreamReader(mystream);
                    string[] str;
                    int num = 0;
 
                    try
                    {
                        string[] str1 = read.ReadToEnd().Split('$');
                        num = str1.Count();
                        dataGridView1.RowCount = num;
                        for (int i = 0; i < num; i++)
                        {
                            str = str1[i].Split('^');
                            for (int j = 0; j < dataGridView1.ColumnCount; j++)
                            {
                                try
                                {
                                   
                                    dataGridView1.Rows[i].Cells[j].Value = str[j];
 
 
 
                                    pBar1.PerformStep();
 
                                }
                                catch { }
                            }
                        }
                    }
                    catch (Exception ex) { MessageBox.Show(ex.Message); }
                    finally { read.Close(); }
 
                }
                
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            
        }
    }
}
Визуально выглядит так:



Вопрос в следующем: Как мне обратится (скорее всего нужно еще и цикл подвязать а может и нет-честно не знаю) к ячейкам из столбца Чистая позиция, и сделать так что бы:

например есть 5 строк, и чистая позиция в них следующая:

1 строка: 15
2 строка: 16
3 строка: 23
4 строка: 21
5 строка: 12

Надо настроить атк что бы если разница между 2 соседними ячейками была меньше Х (например 6) то цвет оставался обычный, а если между ними разница была больше 6 то он их красил в какой нибудь цвет.
То есть если взять Х = 6, то в 5 строчках я выше написаны, должны быть покрашена ячейка: 2, 4

Заранее Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.08.2013, 13:54
Ответы с готовыми решениями:

Закрашивание строки в цвет, при определенных условиях
В общем есть таблица, последний столбец (10й) время (типа 11:02:51). Нужно закрасить те строки, которые повторяются по всем столбцам, кроме...

Изменить цвет определенных ячеек
Доброго дня! Как можно изменить цвет определенных ячеек в listview? (скрин во вложение) Нужно проверить в каком столбце число больше. ...

Изменение цвета определенных ячеек в DataGridview
Всем привет! не могу придумать алгоритм Имеется таблица &quot;dataGridview&quot; Столбцы &quot;№&quot;, &quot;Участник&quot;,...

12
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 14:12
Не понял что такое Чистая позиция?
А дальше, вроде бы Вам нужно 2 цикла, одни по строкам, другой по столбцам. Если последнюю ячейку строки не нужно сравнивать с первой ячейкой следующей строки, то сравнивать ячейку [i,j] с [i,j+1], а вот разукрашивать ячейки стандартный DataGridView кажется не умеет, но я в этом не уверен. Если же действительно не умеет, то Вам поможет SourceGrid - сторонний компонент, Вы его легко найдёте. Этот умеет гораздо больше чем стандартный.
0
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
01.08.2013, 14:56  [ТС]
1) Чистая позиция это можно увидить на картинки- всего лишь название столбца.

2) попробовал вот так:
C#
1
2
3
4
5
 if (i < i+1)
                            {
 
                                dataGridView1.Rows[i].Cells[1].Style.BackColor = Color.Yellow; 
                            }
Получилось............но он окрасил весь столбец.

Я понимаю почему, но я не знаю и не пойму как задать ему определнную ячейку красить??
именно так которая Стала больше
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 15:26
Как я уже говорил, DataGridView не умеет красить ячейки, только столбцы целиком. Если нужно работать с каждой ячейкой отдельно, смотрите в сторону SourceGrid.
P.S. Вместо dataGridView1.Rows[i].Cells[1].Style.BackColor = Color.Yellow;
Можно написать dataGridView1[i,1].Style.BackColor = Color.Yellow;
Так много проще и удобнее.
1
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
01.08.2013, 15:38  [ТС]
он то может красить определенную ячейку--- просто вместо i,1 написать 1,1 и тогда он покрасит 1,1--- то мне то нужно найти именно ту ячейку которая стлала больше предыдущий.

Хорошо, я посмотрю SourceGrid - спасибо за подсказку
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 16:31
Цитата Сообщение от David-Net Посмотреть сообщение
он то может красить определенную ячейку--- просто вместо i,1 написать 1,1 и тогда он покрасит 1,1--- то мне то нужно найти именно ту ячейку которая стлала больше предыдущий.

Хорошо, я посмотрю SourceGrid - спасибо за подсказку
А ну так если может, то не понятно, в чём проблема то?
C#
1
2
3
4
if (grid[i,j+1]>grid[i,j])
{
  grid[i,j+1].Style.BackColor = Color.Yellow;
}
А снаружи циклы по строкам и по столбцам-1
0
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
02.08.2013, 00:52  [ТС]
Проблема в том что он пишет что оператор > не может быть применен

Добавлено через 34 секунды
Цитата Сообщение от Predatore Посмотреть сообщение
А снаружи циклы по строкам и по столбцам-1
А вот это если честно не понял

Добавлено через 34 минуты
Ребята прощу кто может помогите - напишите код как сделать так что бы он сравнивал значения в ячейках Чистая позиция (по картинке можно посомтреть что за ячейки )

в них содержатся цифры типа : 22,56 11,78, 45,44, -14,45 и так далее.

правда уже все варианты пересмотрел не могу их сравнить и сделать так что бы он красил ну каоторая стала больше предыдущий
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
02.08.2013, 11:08
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Обработчик события CellFormatting
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            try
            {
//Если первая строка - не с чем сравнивать. Если не тот столбец - тоже ничего делать не надо
                if (e.Value == DBNull.Value || e.RowIndex==0 || e.ColumnIndex!=1) return;
//Наше условие когда надо закрашивать
                if (Convert.ToDouble(dataGridView1[e.ColumnIndex, e.RowIndex].Value)
                        > Convert.ToDouble(dataGridView1[e.ColumnIndex, e.RowIndex-1].Value))
                    dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Yellow;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
02.08.2013, 11:14
Цитата Сообщение от David-Net Посмотреть сообщение
Проблема в том что он пишет что оператор > не может быть применен

Добавлено через 34 секунды


А вот это если честно не понял

Добавлено через 34 минуты
Ребята прощу кто может помогите - напишите код как сделать так что бы он сравнивал значения в ячейках Чистая позиция (по картинке можно посомтреть что за ячейки )

в них содержатся цифры типа : 22,56 11,78, 45,44, -14,45 и так далее.

правда уже все варианты пересмотрел не могу их сравнить и сделать так что бы он красил ну каоторая стала больше предыдущий
Я просто упростил запись, думал Вы поймёте, нельзя конечно написать grid[i,j]<grid[i,j+1], но можно grid[i,j].value < grid[i,j+1].value
Цикл по столбцам должен быть не по всем столбцам, а до кол-во -1, т.к. мы обращаемся к j+1 столбцу.
P.S. Но предложенный код выше, интереснее, я как-то не подумал про CellFormatting, так конечно же лучше чем по в цикле делать.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
02.08.2013, 11:20
Цитата Сообщение от Predatore Посмотреть сообщение
grid[i,j].value < grid[i,j+1].value
даже этот вариант будет не совсем верным, так как там хранится object и будет по умолчанию сравнивать ссылки, а надо сравнивать значения.
Более того цикл слишком много лопатит почем зря. Гораздо эффективнее использовать CellFormatting - форматирует "на лету" то, что отображается на экране.
0
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
02.08.2013, 14:10  [ТС]
Цитата Сообщение от Learx Посмотреть сообщение
Код C#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Обработчик события CellFormatting
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
* * * * {
* * * * * * try
* * * * * * {
//Если первая строка - не с чем сравнивать. Если не тот столбец - тоже ничего делать не надо
* * * * * * * * if (e.Value == DBNull.Value || e.RowIndex==0 || e.ColumnIndex!=1) return;
//Наше условие когда надо закрашивать
* * * * * * * * if (Convert.ToDouble(dataGridView1[e.ColumnIndex, e.RowIndex].Value)
* * * * * * * * * * * * > Convert.ToDouble(dataGridView1[e.ColumnIndex, e.RowIndex-1].Value))
* * * * * * * * * * dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Yellow;
* * * * * * }
* * * * * * catch (Exception ex)
* * * * * * {
* * * * * * * * MessageBox.Show(ex.ToString());
* * * * * * }
* * * * }
C#
1
 
Спасибо большое, пока что правда не удается подставить в код - я что то немного запутался в своем коде теперь не знаю как этот подставить - куда бы не вставил он почему то начинает выдавть ошибки что ниже код не правильно написан

Добавлено через 4 минуты
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)

Вставляю эту строчку и он уже всем снизу пишет что нужен класс,делега,перечесление, интерфейс или структура

Добавлено через 2 часа 13 минут
немного разобрался- я с утра не сразу понял что это надо просто отдельно вставлять а не в кнопку)

однако вставил до / и после кнопки которая грузит данные--- пока что не что не краситься-- в чем проблема может быть??
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
05.08.2013, 16:45
dataGridView1_CellFormatting - это обработчик события элемента управления dataGridView1.
Достаточно зайти в конструктор формы - клик по гриду - свойства, молния(события) - двойной щелчек по полю напротив CellFormatting - и этот метод студия создает автоматически и сделает все необходимое.
Я его написал чтоб понятно было что это за метод. Вам же необходимо скопировать код ТЕЛА моего метода в метод, созданный студией.

Добавлено через 3 минуты
Обязательно почитайте что такое события, делегаты, обработка событий.
1
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
05.08.2013, 23:37  [ТС]
Цитата Сообщение от Learx Посмотреть сообщение
dataGridView1_CellFormatting - это обработчик события элемента управления dataGridView1.
Достаточно зайти в конструктор формы - клик по гриду - свойства, молния(события) - двойной щелчек по полю напротив CellFormatting - и этот метод студия создает автоматически и сделает все необходимое.
Я его написал чтоб понятно было что это за метод. Вам же необходимо скопировать код ТЕЛА моего метода в метод, созданный студией.
Добавлено через 3 минуты
Обязательно почитайте что такое события, делегаты, обработка событий.

ОГРОМНЕЙШЕЕ СПАСИБО!!!!!!!!!!!!!!!! Тема закрыта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2013, 23:37
Помогаю со студенческими работами здесь

Производительность видеокарты, при определенных условиях
У меня вопрос, возьмем например видеокарту, и подключим к ней 2-3 монитора. На одном из этих мониторов, запустим игру, а на другом,...

Загрузить Iframe при определенных условиях
Доброго всем времени суток. У меня В конце лендоса. 2карты от яндекс. Вот так как после проверки на скорость сайта(гугл инструментом)...

Активация кнопки при определенных условиях
всем привет. реализую функцию активации кнопки при определнных условиях. вот фрагмент работающего кода procedure...

Значения надписи при определённых условиях
Всем привет. У меня есть отчёт с данными пользователя и результатами анкетирования, 5 шкал со своими баллами у каждой шкалы. Не могу...

Транспонировать матрицу при определенных условиях
Помогите , пожалуйста , решить задачу. Дана действительная матрица размерности . Если среднее арифметическое элементов стоящих над...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru