Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Вычисление в dataGridView


Автор: rocky7 25.9.2015, 10:13
Программа считывает таблицу из csv файла и отображает её в dataGridView. Мне нужно в восьмом столбце dataGridView отображать разность значений соседних ячеек шестого столбца. Я это реализовал, но при большом количестве строк таблицы обработка происходит очень медленно и долго приходиться ждать загрузки данных в dataGridView. Я полагаю что DataGridView должен заниматься отображением данных, а не источником данных для вычислений. Как решить эту проблему?
Код

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 Kent.Boogaart.KBCsv;
 
namespace WindowsFormsApplication1
{
    public partial class Form1:Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            DataSet dataSt = new DataSet();//Будущий датасет для данных
            using (CsvReader reader = new CsvReader(@"C:\file.csv"))//Открыли файл КСВ
            {
                reader.ValueSeparator = Char.Parse(";");//Обязательно указывай, какой символ будет являться разделителем в твоём КСВ-файле. В моём случае это точка с запятой
                reader.ReadHeaderRecord();//Этот метод надо вызвать, прежде чем что-либо делать с файлом КСВ. Он считывает заголовок.
                reader.Fill(dataSt);//Закинули в наш ДатаСет новую таблицу со всеми данными из файла.
            }
          
            dataGridView1.DataSource = dataSt.Tables[0];//Всё, видим эти данные глазами
            dataGridView1.Columns.Add("Column9", "Часовой расход");
            dataGridView1.Columns.Add("Column10", "Суточный расход");
            for(int i=0;i<dataGridView1.Rows.Count;i++)
                dataGridView1.Rows[i].Cells[8].Value = Convert.ToDecimal(dataGridView1.Rows[i + 1].Cells[6].Value) - Convert.ToDecimal(dataGridView1.Rows[i].Cells[6].Value);
            
         
        }
    }
}

Автор: jsharp36 25.9.2015, 10:47
После заполнения ридером таблицы, в таблице произведите вычисления, а потом только присваивайте dataGridView1.DataSource.

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

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Vychisleniye-v-dataGridView-id5604f476ae20158a7e8b4567#findElement_E7045_5604fc14ae2015cb01b9cce9_0

Автор: rocky7 25.9.2015, 11:14
Идея понятна. Только не могу разобраться как обращаться к ячейкам таблицы. 

Автор: jsharp36 25.9.2015, 21:13
Элементарно. У таблицы есть Rows. Массив по сути.

Наример, так:

var row = table.Rows[25];

к ячейке в строке можно обращаться по имени колонки (если оно есть):
row["Column1"] = "sdf";
или по номеру:
row[3] = "sdf";

Так же и получают значения, только приведенные к object. Надо приводить к нужному типу

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Vychisleniye-v-dataGridView-id5604f476ae20158a7e8b4567#findElement_E7045_56058ec6ae2015d637b9cdb3_0

Автор: Курсант 26.9.2015, 10:26
Пардон... В Visual C++ я обращаюсь к ячейкам (если хочу получить текстовое значение) следующим образом:
Код

float tmpFloatValue = Convert::ToDouble ( dataGridView1->Rows[RowIndex]->Cells[ColumnIndex]->Value->ToString() );

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

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