Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 18.10.2016
Сообщений: 27

Использование формул в ячейках DataGridView

20.10.2016, 14:38. Показов 3173. Ответов 8

Студворк — интернет-сервис помощи студентам
Собственно, нужно производить вычисления прямо в заполняемой ячейке датагрида, примерно как в экселе. Была идея перебора введенного выражения по символам математических операций (+, -, *, /), но тогда встает вопрос с вводом самих этих символов в переменную, которая заменит содержимое ячейки. Есть какой-либо способ засунуть выражение ячейки в переменную, чтобы переменная считала его не как текст, а как собственную формулу и вычислила результат?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.10.2016, 14:38
Ответы с готовыми решениями:

Перерасчет формул в ячейках
В ячейки написал формулу типа =MyFunc() и написал свою функцию MyFunc(). Эта функция вычисляет значение на основание...

Суммирование результатов формул в других ячейках
Доброго времени суток. Ситуация такая: есть столбец с данными, в котором указан материал и его объем, это могут быть литры, килограммы,...

Пересчёт формул на отдельных диапазонах, столбцах, ячейках
Здравствуйте форумчане! Вопрос такой. Возможно ли задать макросом такие параметры, чтобы пересчитывались только отдельные диапазоны. у меня...

8
Модератор
Эксперт .NET
 Аватар для Yury Komar
4360 / 3430 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
20.10.2016, 15:35
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

могу предложить такой вот вариант, но он имеет свои ограничения на сам вид формул конечно, но примитивные - просчитает:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        DGV.Rows.Add("2+2")
        DGV.Rows.Add("2+2*(3+7)")
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim obj = CreateObject("MSScriptControl.ScriptControl") : obj.Language = "VBScript"
        For Each row As DataGridViewRow In DGV.Rows
            Try
                row.Cells(1).Value = Val(obj.Eval(row.Cells(0).Value))
            Catch ex As Exception
                row.Cells(1).Value = "#ошибка"
            End Try
        Next
    End Sub
End Class
Изображения
 
6
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
20.10.2016, 16:38
Вообще, надо сказать, что пихать данные прямо в грид - это порочная практика и многие проблемы, которые могли бы решиться элементарно, на практике требуют использования костылей, именно благодаря тому, что грид используется не только для отображения, но и для хранения данных.
Решение на самом деле элементарно: используй DataTable (лучше в составе DataSet, но можно и так). Объект DataColumn имеет свойство Expression, с помощью которого можно создавать столбцы с вычисляемыми полями.
Свойство DataColumn.Expression (System.Data)
3
1 / 1 / 0
Регистрация: 18.10.2016
Сообщений: 27
20.10.2016, 18:27  [ТС]
diadiavova,
В моем случае в таблице нужно и хранить данные, и проводить вычисления площадей с привязкой к конкретному объекту, позже вся информация занесенная в таблицу будет использоваться в качестве переменных при дальнейших расчетах.
Грид практически готов к полноценному использованию, но в любом случае спасибо за информацию - учту это при дальнейшей разработке =).

Yury Komar, Да это то, что надо, вычислений сложнее простейшего сложения/умножения не будет. Благодарю.
И еще такой вопрос: как определить первый символ в ячейке или строке? Через Left(dgv.CurrentCell.Value, 1) выдает ошибку.
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
20.10.2016, 19:01
Цитата Сообщение от Химер Посмотреть сообщение
И еще такой вопрос: как определить первый символ в ячейке или строке? Через Left(dgv.CurrentCell.Value, 1) выдает ошибку.
Сперва проверить на nothing, пустые ячейки его возвращают
1
Модератор
Эксперт .NET
 Аватар для Yury Komar
4360 / 3430 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
20.10.2016, 20:36
моно просто
VB.NET
1
If строка.StartWith("A") Then ...
0
1 / 1 / 0
Регистрация: 18.10.2016
Сообщений: 27
21.10.2016, 00:05  [ТС]
Цитата Сообщение от Sklifosofsky Посмотреть сообщение
Сперва проверить на nothing, пустые ячейки его возвращают
Там не должно ничего проверяться, т.к. событие происходит сразу после окончания редактирования значения в одной единственной ячейке (EndCellEditing, если не ошибаюсь)
0
34 / 34 / 6
Регистрация: 24.11.2015
Сообщений: 330
21.10.2016, 08:08
Химер, Вот вам пример.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        DataGridView1.ColumnCount = 3
        DataGridView1.Columns(0).Name = "K1"
        DataGridView1.Columns(1).Name = "K2"
        DataGridView1.Columns(2).Name = "Itog"
 
        Dim row As String() = New String() {"1", "2", "3"}
        DataGridView1.Rows.Add(row)
        row = New String() {"42", "43", "44"}
        DataGridView1.Rows.Add(row)
        row = New String() {"45", "46", "7"}
        DataGridView1.Rows.Add(row)
        row = New String() {"48", "49", "50"}
        DataGridView1.Rows.Add(row)
    End Sub
    Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        Dim InvoiceDetails As DataGridView = DirectCast(sender, DataGridView)
        If IsDBNull(InvoiceDetails(0, e.RowIndex).Value) Then Exit Sub
        InvoiceDetails("Itog", e.RowIndex).Value = InvoiceDetails("K2", e.RowIndex).Value * InvoiceDetails("K1", e.RowIndex).Value
        If (e.ColumnIndex = 2 Or e.ColumnIndex = 3) And InvoiceDetails.Rows.Count > 0 Then
            TextBox1.Text = Total().ToString
        End If
    End Sub
    Private Function Total() As Double
        Dim tot As Double = 0
        Dim i As Integer = 0
        For i = 0 To InvoiceDetailsDataGridView.Rows.Count - 1
            tot = tot + Convert.ToDouble(InvoiceDetailsDataGridView.Rows(i).Cells("Itog").Value)
        Next i
        Return tot
    End Function
    Private Function InvoiceDetailsDataGridView() As Object
        Throw New NotImplementedException
    End Function
Миниатюры
Использование формул в ячейках DataGridView  
Вложения
Тип файла: rar Пример.rar (126.1 Кб, 17 просмотров)
0
1 / 1 / 0
Регистрация: 18.10.2016
Сообщений: 27
21.10.2016, 14:25  [ТС]
Модифицировал код предложенный товарисчем Yury Komar и добавил функцию подстановки первоначального значения ячейки (формулы) при редактировании оной, прямо как в экселе. Использовал скрытый датагрид на 2 столбца, т.к. формулы нужны только в 2 столбцах основного грида, значения в гридах изменяются синхронно, так что если ячейка основоного грида очищается, то и открыть первоначальную формулу не получится. Единственный минус - значение пустой ячейки после вскрытия автоматически заменяется на 0, но это и не важно.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    Dim FirstValue, SecondValue As Object
Dim ri,  ci As Integer
Private Sub MainDataGrid_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles MainDataGrid.CellEndEdit
        If MainDataGrid.CurrentCell.ColumnIndex = 4 Or MainDataGrid.CurrentCell.ColumnIndex = 5 Then
            ri = MainDataGrid.CurrentCell.RowIndex
            ci = MainDataGrid.CurrentCell.ColumnIndex
            If Strings.Left(MainDataGrid.CurrentCell.Value, 1) = "=" Then MainDataGrid.CurrentCell.Value = MainDataGrid.CurrentCell.Value.Replace(Strings.Left(MainDataGrid.CurrentCell.Value, 1), "")
            Dim obj = CreateObject("MSScriptControl.ScriptControl") : obj.Language = "VBScript"
            FirstValue = MainDataGrid.CurrentCell.Value
            DataGridAssister(ci - 4, ri).Value = FirstValue
            For Each row As DataGridViewRow In MainDataGrid.Rows
                Try
                    MainDataGrid.CurrentCell.Value = Val(obj.Eval(MainDataGrid.CurrentCell.Value))
                    SecondValue = MainDataGrid.CurrentCell.Value
                Catch ex As Exception
                    If MsgBox("Текст ошибки", MsgBoxStyle.Critical, "Заголовок ошибки") = MsgBoxResult.Ok Then
                        FirstValue = Nothing
                        Exit For
                    End If
                End Try
            Next
        End If
    End Sub
    Private Sub MainDataGrid_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles MainDataGrid.CellBeginEdit
        If MainDataGrid.CurrentCell.ColumnIndex = 4 Or MainDataGrid.CurrentCell.ColumnIndex = 5 Then
            ri = MainDataGrid.CurrentCell.RowIndex
            ci = MainDataGrid.CurrentCell.ColumnIndex
            If MainDataGrid.CurrentCell.Value = Nothing Then DataGridAssister(ci - 4, ri).Value = Nothing
            If MainDataGrid.CurrentCell.Selected = True Then MainDataGrid.CurrentCell.Value = DataGridAssister(ci - 4, ri).Value
            End If
    End Sub
зы. Оказалось я забыл добавить String перед Left, потому выдавало ошибку.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2016, 14:25
Помогаю со студенческими работами здесь

Дополнение формул в ячейках с появляющихся листов VBA Excel
Существует файл с фиксированным количеством постоянно присутствующих в нем листов, на одном из них собирается сводная информация в виде...

Запись формул, находящихся в определенных ячейках Excel, в код макроса
Добрый день уважаемы форумчане. Вопрос: Есть большое количество формул на листе, как продублировать запись этих формул в те же самые...

Как указать вручную имя столбца для формул в ячейках?
Имеется несколько формул с суммами типа: "=СУММ(D6:I6)", "=СУММ(D7:I7)","=СУММ(D8:H8)" итд. В ячейке А1 указано имя столбца, например ( H )...

Сумма в ячейках datagridview
в таблице excel в ячейках А1 - А3 стоят значения, в А4 вычисляется сумма А1-А3... как сделать тоже самое в Datagrigview ?

DataGridView и CheckBox в ее ячейках
Имеется следующий код: string strSQL; string strConn; strSQL = "SELECT One, Two, Three, Four, Five FROM Table"; strConn =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru