none
Расчет в datagridview на с# RRS feed

  • Вопрос

  • Здравствуйте!

    Подскажите пожалуйста, как реализовать задачу.

    Есть таблица в Access, отображаемая в datagridview. В первых двух колонках хранятся данные в несколько строк. В третью необходимо записать рассчитанные значения, данные для расчета берутся из первых двух колонок.

    Как это лучше сделать? И возможно ли это для нефиксированного количества строк в таблице?

    27 марта 2012 г. 3:30

Ответы

  • Пример:

                DataTable dt = new DataTable("TableName");
                // Предполагаем, что эти колонки у тебя уже есть
                DataColumn ColumnName1 = new DataColumn("First", System.Type.GetType("System.Int32"));
                dt.Columns.Add(ColumnName1);
                DataColumn ColumnName2 = new DataColumn("Second", System.Type.GetType("System.Int32"));
                dt.Columns.Add(ColumnName2);
                //Добавляем колоку у которой указываем Expression
                DataColumn SumColumnName = new DataColumn("Sum", System.Type.GetType("System.Int32"));
                SumColumnName.Expression = "First+Second";
                dt.Columns.Add(SumColumnName);
                //Тестовый набор данных )))
                DataRow dr = dt.NewRow();
                dr["First"] = 1;
                dr["Second"] = 2;
                dt.Rows.Add(dr);
                //Показываем в DataGridView таблицу
                this.dataGridView1.DataSource = dt;
    

    В датагриде это выглядит так:

    • Помечено в качестве ответа nutakov 5 апреля 2012 г. 12:39
    4 апреля 2012 г. 5:54
    Модератор
  • > Мне нужно именно в этой таблице произвести расчеты и занести их в эту же таблицу в незаполненные столбцы.


    для вычисления значений существует DataColumn.Expression, но у него есть ограничения.
    если расчеты сложные, то можно сделать примерно так:

    foreach(DataRow row in mytable.Rows)
    {
       var c1 = (int)row["mycolumn1"];
       var c2 = (int)row["mycolumn2"];
       double res;
       // на основе c1, c2, в сложной формуле ...
       // сохраняете результат в таблице
       rpw["mycolumn3"] = res;
    }

     
     

    • Предложено в качестве ответа Abolmasov Dmitry 4 апреля 2012 г. 10:48
    • Помечено в качестве ответа nutakov 5 апреля 2012 г. 12:39
    4 апреля 2012 г. 8:07

Все ответы

  • > В третью необходимо записать рассчитанные значения, данные для расчета берутся из первых двух колонок.
     
     
    загрузите данные в DataTable и определите в нем DataColumn с необходимым Expression
     
     
    • Помечено в качестве ответа Abolmasov Dmitry 28 марта 2012 г. 10:34
    • Снята пометка об ответе nutakov 4 апреля 2012 г. 5:12
    27 марта 2012 г. 4:32
  • Уважаемый пользователь,

    Если ответ Malobukv решит вашу проблему, пожалуйста, не забудьте его отметить. Для этого под каждым сообщением есть кнопка 'Пометить как ответ'.

    Спасибо.


    Для связи [mail]

    27 марта 2012 г. 7:36
  • Я новичок в этом деле, поэтому я немного непонимаю...

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

    можно код программы для примера?

    4 апреля 2012 г. 5:15
  • Пример:

                DataTable dt = new DataTable("TableName");
                // Предполагаем, что эти колонки у тебя уже есть
                DataColumn ColumnName1 = new DataColumn("First", System.Type.GetType("System.Int32"));
                dt.Columns.Add(ColumnName1);
                DataColumn ColumnName2 = new DataColumn("Second", System.Type.GetType("System.Int32"));
                dt.Columns.Add(ColumnName2);
                //Добавляем колоку у которой указываем Expression
                DataColumn SumColumnName = new DataColumn("Sum", System.Type.GetType("System.Int32"));
                SumColumnName.Expression = "First+Second";
                dt.Columns.Add(SumColumnName);
                //Тестовый набор данных )))
                DataRow dr = dt.NewRow();
                dr["First"] = 1;
                dr["Second"] = 2;
                dt.Rows.Add(dr);
                //Показываем в DataGridView таблицу
                this.dataGridView1.DataSource = dt;
    

    В датагриде это выглядит так:

    • Помечено в качестве ответа nutakov 5 апреля 2012 г. 12:39
    4 апреля 2012 г. 5:54
    Модератор
  • спасибо большое)) сейчас попробую)))
    4 апреля 2012 г. 6:26
  • Это немного не то. Вы в примере создаете новую таблицу и сами заносите данные в столбцы.

    А у меня есть готовая, наполовину заполненная таблица в Access, которую я подключила, и она отображается в DataGrid.

    Мне нужно именно в этой таблице произвести расчеты и занести их в эту же таблицу в незаполненные столбцы.

    4 апреля 2012 г. 6:43
  • А что мешает Вам сделать эти действия с вашей таблицей?
    4 апреля 2012 г. 6:49
    Модератор
  • > Мне нужно именно в этой таблице произвести расчеты и занести их в эту же таблицу в незаполненные столбцы.


    для вычисления значений существует DataColumn.Expression, но у него есть ограничения.
    если расчеты сложные, то можно сделать примерно так:

    foreach(DataRow row in mytable.Rows)
    {
       var c1 = (int)row["mycolumn1"];
       var c2 = (int)row["mycolumn2"];
       double res;
       // на основе c1, c2, в сложной формуле ...
       // сохраняете результат в таблице
       rpw["mycolumn3"] = res;
    }

     
     

    • Предложено в качестве ответа Abolmasov Dmitry 4 апреля 2012 г. 10:48
    • Помечено в качестве ответа nutakov 5 апреля 2012 г. 12:39
    4 апреля 2012 г. 8:07
  • Спасибо, все получилось)) остались только небольшие проблемки...

    полученный результат отображается не сразу после нажатия кнопки расчет, а только после того как по форме немного потыкаешь или свернешь и развернешь ее  и  рассчитанные данные не сохраняются в исходную таблицу кнопкой сохранить с таким кодом: aSchet.Update(st1, "Предприятия");

    5 апреля 2012 г. 3:30
  •  "полученный результат отображается не сразу после нажатия кнопки расчет" - А после привязки вызываете ли метод dataGridView.Update ?
    • Помечено в качестве ответа nutakov 5 апреля 2012 г. 12:39
    • Снята пометка об ответе nutakov 5 апреля 2012 г. 12:39
    5 апреля 2012 г. 5:17
    Модератор
  • Пожалуйста, не забудьте отметить сообщения, которые решают проблему, после того как окончательно разберетесь с ней. Для этого под каждым сообщением есть кнопка 'Пометить как ответ'.

    Спасибо.


    Для связи [mail]

    5 апреля 2012 г. 6:53
  • Эту проблему я решила. Нужно было делать не Update, а Теперь осталась проблема с сохранением рассчитанных данных в таблицу. выпадает ошибка: "

    Необработанное исключение типа "System.InvalidOperationException" произошло в System.Data.dll
    Дополнительные сведения: Сбой сопоставления столбцов из SourceColumn "Стоимость" из-за того, что DataColumn "Стоимость" является вычисляемым столбцом."

    Как ее исправить и сохранить рзультат?

    5 апреля 2012 г. 6:58
  • А Вы случайно не заносите данные в вычисляемый слолбец?
    5 апреля 2012 г. 8:03
    Модератор
  • Спасибо, с этим тоже уже разобралась)) так и есть, пыталась занести данные из вычисляемого столбца)
    5 апреля 2012 г. 12:39