Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Grid, подсветка строки 
V
    Опции темы
Lii
Дата 22.12.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



Задача следующая - есть приложение, оно отображает данные из таблиц и клиентах и их платежах, некоторые такие данные являются датами
так вот необходимо, чтобы те строки, в которых есть просроченные платежи, горели красным цветом
Код

      private void PaintGrid()
              {
                  DateTime currentDate = DateTime.Now;
                  foreach (DataGridViewRow row in dgvGrid.Rows)
                  {
                      string []slices=row.Cells[4].Value.ToString().Split('.');
                      DateTime paymentDate = new DateTime(int.Parse(slices[2]), int.Parse(slices[1]), int.Parse(slices[0]));
                      if(paymentDate<currentDate)
                      {
                          for (int i = 0; i < dgvGrid.Rows.Count; i++)
                          dgvGrid.Rows[i].DefaultCellStyle.BackColor = Color.Blue;
                      }
                  }
              }


в общем это не работает
я думаю может это из-за самой работы с датой ???? кто как считает? а еще смотрите у меня вот если заранее известно в каких столбцах данные, на основе которых подсвечивать строки, то может как-то так прикрутить? помогите плиз, до завтра нужно очень хоть это доделать :(
PM MAIL   Вверх
Fortnox
Дата 22.12.2010, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



А зачем в цикле опять в цикле проходить по строкам? Да и разбивать дату необязательно.
Код

            for (int i = 0; i <= dataGridView.Rows.Count - 2; i++)
            {
                string str = dataGridView.Rows[i].Cells[4].Value.ToString();
                DateTime date = DateTime.ParseExact(str, "dd.MM.yyyy", CultureInfo.InvariantCulture);
                // сравниваем даты
                if (date < DateTime.Now)
                    dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.Blue;
            }

Count - 2 - чтобы избежать ошибки NullReference из-за пустой (новой) строки в гриде.

Добавлено через 3 минуты и 9 секунд
А, формат даты я взял для примера такой: dd.MM.yyyy (день.месяц.год) - 22.12.2010
PM MAIL   Вверх
Lii
Дата 22.12.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



а зачем CultureInfo ? у меня он подчеркивается красным и пишет does not exist 
PM MAIL   Вверх
Fortnox
Дата 22.12.2010, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



Lii, для того, чтобы при обработке даты не учитывались язык и региональные данные. 
А чтобы не подчеркивалось, там где у вас написаны, например:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;

добавьте в конец:
Код

using System.Globalization;


Это сообщение отредактировал(а) Fortnox - 22.12.2010, 23:41
PM MAIL   Вверх
Lii
Дата 22.12.2010, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



ничегошеньки не выходит у меня( 
вот посмотрите пожалуйста во вложенном файле какая ошибка 


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  1.jpg 313,36 Kb
PM MAIL   Вверх
Fortnox
Дата 22.12.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



Замените вот этот ваш кусок кода:
Код

 DateTime currentDate = DateTime.Now;
                  foreach (DataGridViewRow row in dgvGrid.Rows)
                  {
                      string []slices=row.Cells[4].Value.ToString().Split('.');
                      DateTime paymentDate = new DateTime(int.Parse(slices[2]), int.Parse(slices[1]), int.Parse(slices[0]));
                      if(paymentDate<currentDate)
                      {
                          for (int i = 0; i < dgvGrid.Rows.Count; i++)
                          dgvGrid.Rows[i].DefaultCellStyle.BackColor = Color.Blue;
                      }
                  }

на мой, которые выше.
PM MAIL   Вверх
Lii
Дата 22.12.2010, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



ошибка исчезла, но не закрашивается ничего, я правильно написала? (привожу весь весь код)


Код

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 MySql.Data.MySqlClient;
using System.Globalization;

namespace OrderReporter
{
    public partial class MainForm : Form
    {
        private DataSet _dataSet;

        public MainForm()
        {
            InitializeComponent();

            MySqlConnection connection = new MySqlConnection("Database=orders; Data Source=localhost; User ID = root; Password=");//создаем подключение
            MySqlCommand command = connection.CreateCommand();//создаем команду для выборки данных
            //SQL запрос
            command.CommandText = "select contract.number, contract.name, domain.name, DATEDIFF(domain.end_registration_date,CURDATE()), DATE_FORMAT(payment.payment_date, \"%d.%c.%Y\"), DATE_FORMAT(payment.end_contract_date, \"%d.%c.%Y\") from contract, domain, payment where contract.number=domain.contract_number and contract.number=payment.contract_number";
            MySqlDataAdapter filler = new MySqlDataAdapter(command);//создание адаптера

            _dataSet = new DataSet();
            filler.Fill(_dataSet);//заполнение датасета

            dgvGrid.AutoGenerateColumns = false;
            dgvGrid.DataSource = _dataSet.Tables[0];
            for (int i = 0; i < dgvGrid.Columns.Count; i++)
                dgvGrid.Columns[i].DataPropertyName = _dataSet.Tables[0].Columns[i].ColumnName;


            PaintGrid();
        }

        private void PaintGrid()
        {
            DateTime currentDate = DateTime.Now;
            foreach (DataGridViewRow row in dgvGrid.Rows)
            {
                string[] slices = row.Cells[4].Value.ToString().Split('.');
                DateTime paymentDate = new DateTime(int.Parse(slices[2]), int.Parse(slices[1]), int.Parse(slices[0]));
                if (paymentDate < currentDate)
                {
                    for (int i = 0; i < dgvGrid.Rows.Count; i++)
                        dgvGrid.Rows[i].DefaultCellStyle.BackColor = Color.Green;
                }
            }
        }
 
    
    
    }
}


Это сообщение отредактировал(а) Lii - 22.12.2010, 23:55
PM MAIL   Вверх
Fortnox
Дата 22.12.2010, 23:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



Вот так, это ваш кусок кода выше с моими изменениями. Копируйте и должно работать:
Код

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 MySql.Data.MySqlClient;
using System.Globalization;

namespace OrderReporter
{
    public partial class MainForm : Form
    {
        private DataSet _dataSet;

        public MainForm()
        {
            InitializeComponent();

            MySqlConnection connection = new MySqlConnection("Database=orders; Data Source=localhost; User ID = root; Password=");
            MySqlCommand command = connection.CreateCommand();
            
            command.CommandText = "select contract.number, contract.name, domain.name, DATEDIFF(domain.end_registration_date,CURDATE()), DATE_FORMAT(payment.payment_date, \"%d.%c.%Y\"), DATE_FORMAT(payment.end_contract_date, \"%d.%c.%Y\") from contract, domain, payment where contract.number=domain.contract_number and contract.number=payment.contract_number";
            MySqlDataAdapter filler = new MySqlDataAdapter(command);

            _dataSet = new DataSet();
            filler.Fill(_dataSet);

            dgvGrid.AutoGenerateColumns = false;
            dgvGrid.DataSource = _dataSet.Tables[0];
            for (int i = 0; i < dgvGrid.Columns.Count; i++)
                dgvGrid.Columns[i].DataPropertyName = _dataSet.Tables[0].Columns[i].ColumnName;


            PaintGrid();
        }

        private void PaintGrid()
        {
            for (int i = 0; i <= dgvGrid.Rows.Count - 2; i++)
            {
                string str = dgvGrid.Rows[i].Cells[4].Value.ToString();
                DateTime date = DateTime.ParseExact(str, "dd.MM.yyyy", CultureInfo.InvariantCulture);
                if (date < DateTime.Now)
                    dgvGrid.Rows[i].DefaultCellStyle.BackColor = Color.Blue;
            }
        }
    }
}

PM MAIL   Вверх
Lii
Дата 23.12.2010, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



я проклята 
не закрашивается (
PM MAIL   Вверх
Fortnox
Дата 23.12.2010, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



Lii, если проект не секретный, прикрепите к сообщению. Я его скачаю, поправлю закрашивание и прикреплю к сообщению. 
Иначе, покажите содержимое файла с кодом, куда вы вставляете код, еще раз.

Добавлено через 3 минуты и 2 секунды
Вам просто надо заменить вот этот код у себя:
Код

  DateTime currentDate = DateTime.Now;
            foreach (DataGridViewRow row in dgvGrid.Rows)
            {
                string[] slices = row.Cells[4].Value.ToString().Split('.');
                DateTime paymentDate = new DateTime(int.Parse(slices[2]), int.Parse(slices[1]), int.Parse(slices[0]));
                if (paymentDate < currentDate)
                {
                    for (int i = 0; i < dgvGrid.Rows.Count; i++)
                        dgvGrid.Rows[i].DefaultCellStyle.BackColor = Color.Green;
                }
            }

на этот:
Код

 for (int i = 0; i <= dgvGrid.Rows.Count - 2; i++)
            {
                string str = dgvGrid.Rows[i].Cells[4].Value.ToString();
                DateTime date = DateTime.ParseExact(str, "dd.MM.yyyy", CultureInfo.InvariantCulture);
                if (date < DateTime.Now)
                    dgvGrid.Rows[i].DefaultCellStyle.BackColor = Color.Blue;
            }

PM MAIL   Вверх
Lii
Дата 23.12.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



вот проект, там внутри и дамп базы на всякий случай

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  OrderReporter.zip 50,27 Kb
PM MAIL   Вверх
Fortnox
Дата 23.12.2010, 00:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



Ах, это моя ошибка. Увидел после того, как открыл проект. После вызова конструктора класса, в данном случае MainForm, где идет первоначальная зарисовка строк, идет вызов события Show (если не ошибаюсь), а он в свою очередь вызывает перерисовку всех элементов управления формы, в том числе и грида. Естественно, после перерисовки строки будут не закрашены.

Так что, чтобы строки были закрашены всегда в зависимости от даты, надо добавить закраску в обработчик события Paint грида.

Код

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 MySql.Data.MySqlClient;
using System.Globalization;
namespace OrderReporter
{
    public partial class MainForm : Form
    {
        private DataSet _dataSet;
        public MainForm()
        {
            InitializeComponent();

            MySqlConnection connection = new MySqlConnection("Database=orders; Data Source=localhost; User ID = root; Password=");
            MySqlCommand command = connection.CreateCommand();

            command.CommandText = "select contract.number, contract.name, domain.name, DATEDIFF(domain.end_registration_date,CURDATE()), DATE_FORMAT(payment.payment_date, \"%d.%c.%Y\"), DATE_FORMAT(payment.end_contract_date, \"%d.%c.%Y\") from contract, domain, payment where contract.number=domain.contract_number and contract.number=payment.contract_number";
            MySqlDataAdapter filler = new MySqlDataAdapter(command);
            _dataSet = new DataSet();
            filler.Fill(_dataSet);
            dgvGrid.AutoGenerateColumns = false;
            dgvGrid.DataSource = _dataSet.Tables[0];
            for (int i = 0; i < dgvGrid.Columns.Count; i++)
                dgvGrid.Columns[i].DataPropertyName = _dataSet.Tables[0].Columns[i].ColumnName;

            dgvGrid.Paint += dgvGrid_Paint;
        }

        void dgvGrid_Paint(object sender, PaintEventArgs e)
        {
            PaintGrid();
        }


        private void PaintGrid()
        {
            for (int i = 0; i <= dgvGrid.Rows.Count - 1; i++)
            {
                string str = dgvGrid.Rows[i].Cells[4].Value.ToString();
                DateTime date = DateTime.ParseExact(str, "dd.MM.yyyy", CultureInfo.InvariantCulture);
                if (date < DateTime.Now)
                    dgvGrid.Rows[i].DefaultCellStyle.BackColor = Color.Blue;
            }
        }
    }
}

В вашем же проекте сделал. Вам только надо будет обновить ссылку в обозревателе решений на MySql. Просто добавьте еще раз.


Это сообщение отредактировал(а) Fortnox - 23.12.2010, 00:37

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  OrderReporter.zip 53,83 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.