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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление в dataGridView, Оптимизация вычислений в таблице 
:(
    Опции темы
rocky7
Дата 25.9.2015, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Программа считывает таблицу из 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);
            
         
        }
    }
}

PM MAIL   Вверх
jsharp36
Дата 25.9.2015, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
rocky7
Дата 25.9.2015, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Идея понятна. Только не могу разобраться как обращаться к ячейкам таблицы. 
PM MAIL   Вверх
jsharp36
Дата 25.9.2015, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Элементарно. У таблицы есть Rows. Массив по сути.

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

var row = table.Rows[25];

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

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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Курсант
Дата 26.9.2015, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

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



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

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

Вообще лично мне на ум приходит использование массива, в котором будут выполнены все вычисления, и уже потом из этого массива можно заполнить DataGridView;
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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