Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Grid, подсветка строки


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

      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;
                      }
                  }
              }


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

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

            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

Автор: Lii 22.12.2010, 23:37
а зачем CultureInfo ? у меня он подчеркивается красным и пишет does not exist 

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

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

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

using System.Globalization;

Автор: Lii 22.12.2010, 23:48
ничегошеньки не выходит у меня( 
вот посмотрите пожалуйста во вложенном файле какая ошибка 

Автор: Fortnox 22.12.2010, 23:51
Замените вот этот ваш кусок кода:
Код

 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;
                      }
                  }

на мой, которые выше.

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


Код

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;
                }
            }
        }
 
    
    
    }
}

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

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;
            }
        }
    }
}

Автор: Lii 23.12.2010, 00:02
я проклята 
не закрашивается (

Автор: Fortnox 23.12.2010, 00:07
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;
            }

Автор: Lii 23.12.2010, 00:13
вот проект, там внутри и дамп базы на всякий случай

Автор: Fortnox 23.12.2010, 00:33
Ах, это моя ошибка. Увидел после того, как открыл проект. После вызова конструктора класса, в данном случае 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. Просто добавьте еще раз.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)