EntryLevelGuy! Ответов: 2

Помогите... Вычислите среднее значение определенных ячеек в выбранной строке.


Помогите... Я хочу вычислить среднее значение определенных ячеек в выбранной строке и поместить его в средний столбец. Спасибо

Что я уже пробовал:

пробовать
{
dataGridView1.Rows[5].Ячейки[0].Значение.Метод toString();
dataGridView1.Rows[5].Ячейки[1].Значение.Метод toString();
dataGridView1.Rows[5].Ячейки[2].Значение.Метод toString();
dataGridView1.Rows[5].Ячейки[3].Значение.Метод toString();
dataGridView1.Rows[5].Ячейки[4].Значение.Метод toString();
dataGridView1.Rows[5].Ячейки[5].Значение.Метод toString();
dataGridView1.Rows[5].Ячейки[6].Значение.Метод toString();



по каждому элементу (элемент ячейки datagridviewrow в dataGridView1.Строк)
{

dataGridView1.Rows[5].Ячейки[7].Значение =
(Двойной.Parse(dataGridView1.Rows[5].Ячейки[0].Значение.Метод toString()) +
Двойной.Parse(dataGridView1.Rows[5].Ячейки[1].Значение.Метод toString()) +
Двойной.Parse(dataGridView1.Rows[5].Ячейки[2].Значение.Метод toString()) +
Двойной.Parse(dataGridView1.Rows[5].Ячейки[3].Значение.Метод toString()) +
Двойной.Parse(dataGridView1.Rows[5].Ячейки[4].Значение.Метод toString()) +
Двойной.Parse(dataGridView1.Rows[5].Ячейки[5].Значение.Метод toString()) +
Двойной.Parse(dataGridView1.Rows[5].Ячейки[6].Значение.ToString ())). ToString();



}

}

EntryLevelGuy!

Это то, что я пробовал, это в ручном режиме. Хотя это работает, мне нужно вычислить таблицу с 2000+ строками и 100+ столбцами. Это ниже, только вычислить одну строку и 8 столбцов. Когда я использую это, таблица фильтровалась и показывала только то, что я пишу на "Select column1, column2 ... от". Это не работает, когда была показана вся таблица.

BillWoodruff

Являются ли все данные Excel импортированными в C# как DataTable ? Или вы импортируете выбранные строки ? Покажите код, который получает данные.

EntryLevelGuy!

Да, я импортировал данные из excel и отобразил их в datagridview. Но на данный момент я отфильтровал его и выбрал только некоторые из столбцов, которые должны были быть вычислены, потому что есть также id, имя и т. д. столбец и так как его слишком много.
пробовать {


строки возведения = "поставщика = Майкрософт.Туз.Oledb для.12.0;Источник данных=" + materialSingleLineTextField1.Текст + ";дополнительные свойства = \"значение Excel 12.0;HDR съемка =да;компания IMEX = 1;\"";
OleDbConnection con = new OleDbConnection(constr);
Объект oledbdataadapter ПДД = новый объект oledbdataadapter("выберите клавишу F12, F13 находился, F102 от [" + элемент combobox1.SelectedValue + "]", кон);
DataTable dt = новый DataTable();
ПДД.Заполнить(ДТ);
это.dataGridView1.Источник данных = ДТ.DefaultView;

по каждому элементу (объекта datarow Row в ДТ.Строк)
{
dataGridView1.Источник данных = ДТ;
}

}
catch (исключение)
{
Form3 Ф3 = новый Form3();
Ф3.Показать();
}

это код, который я использовал. я также использовать диалоговое окно openfiledialog, чтобы выбрать файл XLSX

2 Ответов

Рейтинг:
5

BillWoodruff

Есть некоторые мои предыдущие ответы, которые, я думаю, вы можете найти полезными:

0 DataTable.Вычислительный метод: [^] дает вам несколько похожий на Excel синтаксис для вычисления в DataTable.

1a имеет множество методов расширения, которые могут быть легко изменены для расчета " среднего значения: [^]

1Б [^]

2 Использование метода расширения поля для фильтрации строк по полю: [^] Примечание: требуется добавить ссылку на System.Data.DataSetExtensions.dll

Я бы сказал, что ваш лучший шанс-использовать DataTable.Вычислять.

После любого вычисления/изменения в DataTable убедитесь, что вы сбросили свойство DataSource DataGridView.


EntryLevelGuy!

Большое спасибо! Я попробую это сделать, а потом прокомментирую здесь. Надеюсь, это сработает для меня :))

Рейтинг:
13

OriginalGriff

Это не среднее значение - это сумма. Среднее значение вычисляется путем суммирования других строк и деления суммы на количество элементов, которые вы сложили вместе.
Кроме того, это не делает ничего особенно полезного, потому что он всегда суммирует одну и ту же строку - включая место, в которое вы вставляете результат каждый раз, - и первый набор строк перед тем, как foreach линия вообще ничего не делает ...

Если вы хотите показать среднее значение для каждой строки, то либо используйте Практическое руководство.Событие RowPrePaint[^] или добавьте формулу в свой файл Excel, чтобы она вычислялась движком при доступе к электронной таблице.

И вы не должны использовать и изменять значения строк, вы должны использовать и изменять лежащие в их основе данные непосредственно в источнике данных.

Честно говоря, это выглядит так, как будто вы собрали его в спешке и просто надеялись, что он волшебным образом сделает то, что вы хотите, - а разработка вообще так не работает!


BillWoodruff

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

Но, как сказал Нильс Бор о теории Паули: “мы все согласны, что ваша теория сумасшедшая. Вопрос, который разделяет нас, заключается в том, достаточно ли это безумно, чтобы иметь шанс быть правильным.”

OriginalGriff

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

BillWoodruff

Я не знаю, как именно Excel обрабатывает покраску строк: если бы вы знали наверняка, то не было бы ненужного многократного перекрашивания ... отлично !

OriginalGriff

Код, который он показывает, - это код C#, использующий DataGridView-он получает доступ к своим данным из файла Excel через ODBC, поэтому Excel painting не используется. Отсюда и бит "добавить формулу".

BillWoodruff

ааа ... Я вижу... Я должен был бы сказать: я не знаю, как именно DGV обрабатывает покраску для рядов: если бы вы знали наверняка, не было бы ненужной многократной перекраски ... отлично !

OriginalGriff

Каждый раз, когда строка должна быть окрашена, событие PrePaint вызывается один раз - что идеально подходит для средних значений столбцов и тому подобного, поскольку оно дает "мгновенный снимок" именно тогда, когда это необходимо, а не "предварительный расчет" каждого значения строки.
Существует также событие CellPainting, которое вызывается для каждой ячейки в строке и очень удобно для раскрашивания отдельных ячеек, например, для обозначения положительного / отрицательного.
https://www.codeproject.com/Tips/1240904/Colouring-DataGridView-Cells-According-to-their-Co

BillWoodruff

Теперь я действительно рад, что откликнулся на ваше решение, поскольку ваш ответ просветил меня относительно одного аспекта DGV, о котором я не знал. Спасибо! Проголосовал № 5.

OriginalGriff

Больше, чем добро пожаловать, мой друг!