Форум программистов, компьютерный форум, киберфорум
Наши страницы

Visual Basic .NET

Войти
Регистрация
Восстановить пароль
 
 
vova_king
22 / 22 / 8
Регистрация: 29.07.2010
Сообщений: 261
#1

Построение графика по данным из БД - Visual Basic .NET/.NET 4.x

17.04.2016, 15:25. Просмотров 699. Ответов 15
Метки нет (Все метки)

Доброе время суток, знатоки!
Есть данные которые берутся из базу
100 - 01.04.2016
30 - 02.04.2016
50 - 03.04.2016
и т.д.
Как построить примитивный график для отображения данных взятых из базы?
что то на подобии этого как на картинке?
0
Миниатюры
Построение графика по данным из БД  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2016, 15:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос .NET 4.x Построение графика по данным из БД (Visual Basic .NET):

Построение графика по исходным данным - Visual Basic .NET
Зделал интерфейс из 3х закладок. На первом вводятся исходные данные (координаты по осям), на втором выберается x-y или y-x, а на третьем...

Построение графиков по отобранным данным - Visual Basic .NET
Здравствуйте!Нужна ваша помощь. Есть таблица, к таблице создал процедуру для отбора данных, вопрос такой, можно ли как то на прямую строить...

Построение точек в ZedGraph, по данным из DataGridView - Visual Basic .NET
Снова добрый вечер, друзья. Вопрос - как задать в ZedGraph, чтобы точки строились по данным из datagridview? Пока компилятор...

Вывод графика в Chart по данным из таблицы БД - Visual Basic .NET
Здравствуйте!!! Столкнулся с проблемой вывода графика по таблице(VB 2012). Выдает ошибку: Приведение строки к типу integer является...

Построение графика - Visual Basic .NET
Имеется одномерный массив, заполненный случайными значениями в диапазоне от 1 до 10. Нужно построить график по этим значениям. По оси Х...

Построение графика - Visual Basic .NET
Всех приветствую! Мужики, помогите разобраться. Вот такой график нужно построить: У меня только вот так получается: ...

15
Памирыч
Почетный модератор
20828 / 8710 / 1032
Регистрация: 11.04.2010
Сообщений: 11,010
17.04.2016, 15:35 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Попробуйте разобрать пример.
На форме PictureBox и таймер

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
35
36
37
38
39
40
    Dim Pts As New List(Of Point)
    Dim R As New Random
    Dim Cnt As Integer
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox1.Refresh()
    End Sub
 
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
 
        CorelDraw(e)
        If Pts.Count > 2 Then
            e.Graphics.DrawCurve(Pens.Red, Pts.ToArray)
        End If
 
        If Pts.Count < 23 Then
            Pts.Add(New Point(Cnt * 20 + 20, 380 - R.Next(0, 300)))
            Cnt += 1
        End If
        For Each P As Point In Pts
            e.Graphics.DrawString(P.X - 20 & "x" & 380 - P.Y, New Font("Arial", 8), Brushes.Black, P.X - 25, P.Y - 15)
            e.Graphics.FillEllipse(Brushes.Orange, New Rectangle(P.X - 2, P.Y - 2, 4, 4))
        Next
 
    End Sub
 
    Sub CorelDraw(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 20, 400)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 15, 20)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 25, 20)
        e.Graphics.DrawLine(Pens.Blue, 5, 380, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 375, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 385, 500, 380)
        For I As Integer = 20 To 450 Step 20 'X
            e.Graphics.DrawLine(Pens.Blue, I, 377, I, 383)
        Next
        For I As Integer = 380 To 30 Step -20 'Y
            e.Graphics.DrawLine(Pens.Blue, 17, I, 23, I)
        Next
    End Sub
Может, что-то натолкнет Вас на мысли
2
Миниатюры
Построение графика по данным из БД  
vova_king
22 / 22 / 8
Регистрация: 29.07.2010
Сообщений: 261
17.04.2016, 16:57  [ТС] #3
Цитата Сообщение от Памирыч Посмотреть сообщение
Попробуйте разобрать пример.
Как я понял делает рандомно
vb.net
1
Dim R As New Random
Но как каждый раз вставлять данные в переменную R (которая не будет рандомной) нужный параметр в строку:
vb.net
1
Pts.Add(New Point(Cnt * 20 + 20, 380 - R.Next(0, 300)))
0
Памирыч
Почетный модератор
20828 / 8710 / 1032
Регистрация: 11.04.2010
Сообщений: 11,010
17.04.2016, 17:49 #4
vova_king, так пример и дан для разбора, экспериментируйте
1
vova_king
22 / 22 / 8
Регистрация: 29.07.2010
Сообщений: 261
18.04.2016, 09:50  [ТС] #5
Цитата Сообщение от Памирыч Посмотреть сообщение
экспериментируйте
поэкспериментировал, разобрался (до 1 ночи сидел разбирался), только вот бы теперь разобраться, как тест (дат) перевернуть под -90градусов
0
Миниатюры
Построение графика по данным из БД  
vova_king
22 / 22 / 8
Регистрация: 29.07.2010
Сообщений: 261
18.04.2016, 12:58  [ТС] #6
Если использовать
vb.net
1
e.graphis.rotatetransform (45)
все плящет по разным местам picturebox
0
Памирыч
Почетный модератор
20828 / 8710 / 1032
Регистрация: 11.04.2010
Сообщений: 11,010
18.04.2016, 14:07 #7
Цитата Сообщение от vova_king Посмотреть сообщение
все плящет по разным местам picturebox
Разумеется, Вы же поворачиваете весь холст.
Графику надо повернуть, подписать оси и повернуть обратно, как было.

Процедура CorelDraw слегка изменится
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
    Sub CorelDraw(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 20, 400)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 15, 20)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 25, 20)
        e.Graphics.DrawLine(Pens.Blue, 5, 380, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 375, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 385, 500, 380)
 
        For I As Integer = 20 To 450 Step 20 'X
            e.Graphics.DrawLine(Pens.Green, I, 377, I, 383)
        Next
 
        'Подписи в 90 град.
        e.Graphics.RotateTransform(-90)
        e.Graphics.TranslateTransform(-512, 14)
        For I As Integer = 20 To 430 Step 20
            e.Graphics.DrawString(I, Me.Font, Brushes.Black, 100, I)
        Next
        e.Graphics.TranslateTransform(512, -14)
        e.Graphics.RotateTransform(90)
        '// подписи
 
        For I As Integer = 380 To 30 Step -20
            e.Graphics.DrawLine(Pens.Blue, 17, I, 23, I)
        Next
    End Sub
1
Миниатюры
Построение графика по данным из БД  
ovva
2148 / 1852 / 460
Регистрация: 02.02.2013
Сообщений: 1,726
Записей в блоге: 2
18.04.2016, 19:17 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если построение графика не является самоцелью, то логичнее использовать компонент MSChart (или другой подобный).
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    With Chart1
        .DataSource = tb 'таблица, три поля: ID, tstValue, tstDate
        .Series(0).XValueMember = "tstDate"
        .Series(0).XValueType = DataVisualization.Charting.ChartValueType.Date
        .Series(0).YValueMembers = "tstValue"
        .Series(0).ChartType = DataVisualization.Charting.SeriesChartType.Line
        .Series(0).Color = Color.Red
        .Series(0).IsValueShownAsLabel = True
        .Series(0).IsVisibleInLegend = False
        .ChartAreas(0).AxisX.Interval = 1
        .Show()
    End With
End Sub
3
Миниатюры
Построение графика по данным из БД  
vova_king
22 / 22 / 8
Регистрация: 29.07.2010
Сообщений: 261
19.04.2016, 18:29  [ТС] #9
Цитата Сообщение от ovva Посмотреть сообщение
MSChart
а если у меня не используется DGV, как в таком случаи применять datasource?

Добавлено через 20 минут
В примере который показал Памирыч
я сделал так:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 '------------ постороение графика --------------------------------
    Dim Pts As New List(Of Point)
    Dim Dts As New List(Of String)
    Dim R As New Random
    Dim Cnt As Integer
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox7.Refresh()
    End Sub
 
    Private Sub PictureBox7_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox7.Paint
        CorelDraw(e)
        If Pts.Count > 1 Then
            e.Graphics.DrawCurve(Pens.Orange, Pts.ToArray) ' цвет построения линии
        End If
        For Each P As Point In Pts
            e.Graphics.FillEllipse(Brushes.Red, New Rectangle(P.X - 2, P.Y - 2, 4, 4)) ' пишет точки 
        Next
    End Sub
    '================================== подсчет для графика ====================================
    ' функция для отображения осей координат
    Sub CorelDraw(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 20, 400)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 15, 20)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 25, 20)
        e.Graphics.DrawLine(Pens.Blue, 5, 380, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 375, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 385, 500, 380)
        For I As Integer = 20 To 450 Step 20 'X
            e.Graphics.DrawLine(Pens.DarkCyan, I, 377, I, 383)
        Next
        For I As Integer = 0 To 300 Step 20 'Y
            e.Graphics.DrawLine(Pens.Blue, 17, I, 23, I)
            e.Graphics.DrawString(300 - I, New Font("time new roman", 8), Brushes.Blue, 0, I - 4)
        Next
        Dim cnt As Integer = 25
        For Each D As String In Dts
            e.Graphics.DrawString(D, New Font("Arial", 8), Brushes.Blue, cnt, 380)
            cnt += 20
        Next    
    End Sub
    Private Sub Button44_Click(sender As Object, e As EventArgs) Handles Button44.Click
        PictureBox7.Location = New Point(2, 3)
                Dim D = DateTime.Today  ' получаем текущию дату
        Dim Dp = D.ToString("MM.yyyy", CultureInfo.InvariantCulture) ' преобразовываем текущую дату в нужный формат месяц-год
        Label27.Text = Dp
        sqConnection.Open() '
        Dim pdp As Integer
        Dim command As SQLiteCommand = New SQLiteCommand("select COUNT(DISTINCT `dat`) from Se where dat like '%" & Dp & "';", sqConnection)
        Dim reader As SQLiteDataReader = command.ExecuteReader()
        If reader.HasRows Then
            Do While reader.Read()
                pdp = reader.GetInt32(0)
            Loop
        Else : Console.WriteLine("noy")
        End If
        reader.Close()
        For i = 0 To pdp
            Dim di = DateTime.Today
            Dim diu = di.ToString("dd", CultureInfo.InvariantCulture)
            Dim newdat = D.AddDays(-i).ToString.Replace(" 0:00:00", "")
            Console.WriteLine(newdat)
            Dim command1 As SQLiteCommand = New SQLiteCommand("select COUNT(DISTINCT `namess`) from Se where dat = '" & newdat & "';", sqConnection)
            Dim reader1 As SQLiteDataReader = command1.ExecuteReader()
            If reader1.HasRows Then
               Do While reader1.Read()
                    Dim pdp1 = reader1.GetInt32(0)
                    If Pts.Count < pdp Then
                        Pts.Add(New Point(Cnt * 20 + 20, 300 - pdp1))
                        Dts.Add(newdat)
                        Cnt += 1
                    End If
                    Console.WriteLine(pdp1)
                Loop
            Else : Console.WriteLine("noy")
            End If
            reader1.Close()
        Next
        sqConnection.Close()
        PictureBox7.Refresh()
        PictureBox7.Visible = True
    End Sub
0
vova_king
22 / 22 / 8
Регистрация: 29.07.2010
Сообщений: 261
19.04.2016, 18:52  [ТС] #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Все Всем спасибо большое. Все заработало.
Кликните здесь для просмотра всего текста

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Private Sub Button45_Click(sender As Object, e As EventArgs) Handles Button45.Click
 
 
        Dim D = DateTime.Today  ' получаем текущию дату
        Dim Dp = D.ToString("MM.yyyy", CultureInfo.InvariantCulture) ' преобразовываем текущую дату в нужный формат месяц-год
        Label27.Text = Dp
        sqConnection.Open() ' получаем даты
        Dim pdp As Integer
        Dim command As SQLiteCommand = New SQLiteCommand("select COUNT(DISTINCT `dat`) from Se where dat like '%" & Dp & "';", sqConnection)
        Dim reader As SQLiteDataReader = command.ExecuteReader()
        If reader.HasRows Then
            Do While reader.Read()
                pdp = reader.GetInt32(0)
 
 
            Loop
        Else : Console.WriteLine("noy")
        End If
        reader.Close()
 
        For i = 0 To pdp
            Dim di = DateTime.Today
            Dim diu = di.ToString("dd", CultureInfo.InvariantCulture)
            'Dim newdat = diu(-i).ToString
            Dim newdat = D.AddDays(-i).ToString.Replace(" 0:00:00", "")
            Console.WriteLine(newdat)
            Dim pdp1 As Integer
            Dim command1 As SQLiteCommand = New SQLiteCommand("select COUNT(DISTINCT `namess`) from Se where dat = '" & newdat & "';", sqConnection)
            Dim reader1 As SQLiteDataReader = command1.ExecuteReader()
            If reader1.HasRows Then
 
                Do While reader1.Read()
                    pdp1 = reader1.GetInt32(0)
                    Chart1.Series("1").XValueType = DataVisualization.Charting.ChartValueType.Date
                    Chart1.Series("1").ChartType = DataVisualization.Charting.SeriesChartType.Line
                    Chart1.Series("1").Color = Drawing.Color.Black
                    Chart1.Series("1").IsValueShownAsLabel = True
                    Chart1.Series("1").IsVisibleInLegend = False
                    Chart1.ChartAreas(0).AxisX.Interval = 1
                    Chart1.Series("1").Points.AddXY(newdat, pdp1)
                    Console.WriteLine(pdp1)
                Loop
            Else : Console.WriteLine("noy")
            End If
            reader1.Close()
        Next
        sqConnection.Close()
        Chart1.Visible = True
    End Sub
2
Миниатюры
Построение графика по данным из БД  
vova_king
22 / 22 / 8
Регистрация: 29.07.2010
Сообщений: 261
10.09.2016, 22:39  [ТС] #11
А можно вопрос?
Почему он с течением какого-то времени отображает данные не с 01 (начала месяца) а захватывает 1 день с прошлого с месяца?
0
Миниатюры
Построение графика по данным из БД  
Yury Komar
Модератор
2350 / 2155 / 339
Регистрация: 27.01.2014
Сообщений: 3,832
Завершенные тесты: 1
10.09.2016, 22:50 #12
доп вопрос: а как кликнув по графику - получить Дату и значение в месте клика, скажет в MessageBox? че-то не вьехал, а очень надо... или же при движении мышки в реальном времени читать значения графика куда-нибудь в лэйбл?

тоесть есть проект, и график выбирает данные за год и более, и отследить изменения на графике очень тяжело визуально. как-то можно кликая по нему - получить значения в месте клика?
0
Миниатюры
Построение графика по данным из БД  
ovva
2148 / 1852 / 460
Регистрация: 02.02.2013
Сообщений: 1,726
Записей в блоге: 2
11.09.2016, 00:24 #13
Yury Komar,
Добавьте ToolTip. Тогда можно так
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Chart1_GetToolTipText(sender As System.Object, e As System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs) Handles Chart1.GetToolTipText
    Dim sts As Boolean
    Dim txt As String = ""
    Dim htResult As HitTestResult = e.HitTestResult
    If htResult.PointIndex = -1 OrElse htResult.Series Is Nothing Then
        sts = False
    Else
        sts = True
    End If
    Me.ToolTip1.Active = sts
    If sts Then
        txt = e.HitTestResult.Series.Points(e.HitTestResult.PointIndex).ToString()
        ToolTip1.Show(txt, Chart1, e.X, e.Y + 20)
    End If
End Sub
Правда, здесь нужно заметить:
Данные берутся для точки и не интерполируются.
Значения в формате Date будут представлены в виде целого числа.
1
Yury Komar
Модератор
2350 / 2155 / 339
Регистрация: 27.01.2014
Сообщений: 3,832
Завершенные тесты: 1
11.09.2016, 11:05 #14
ovva, спасибо. попробую.

Добавлено через 2 минуты
ovva, а Zoom колесом мышки есть у этого компонента? у меня есть одно решение, позже скину, но он работает очень криво. может ечть встроенное решение?

Добавлено через 3 часа 51 минуту
ovva, спасибо, попробовал, но, это не то немного... мне же хотелось бы при клике по графику в любом месте, нарисовать кармер красны(он ка ратинке отображается) и получить все значения по всем осям на этом маркере.
тоесть:
1) кликаем, отображается красный маркер в месте клика (готово)
2) например в MsgBox показать значения всех нарисованных графиков в месте маркера по оси Y включая значение (оно одно для всех будет, по оси X...

это реально сделать?
0
Yury Komar
Модератор
2350 / 2155 / 339
Регистрация: 27.01.2014
Сообщений: 3,832
Завершенные тесты: 1
11.09.2016, 11:57 #15
разобрался с выводом ВСЕХ значений по оси Х в тултип, но это только при наведении на любую из линий гафиков. а нужно переделать на клик по графику, а еще лучше на движение мышки по полю влево-вправо, курсор сам рисуоваться должен и в отдельном окошке показывать все параметры, которые в тултипе сохранены. думаю реально. буду разбираться, вот пока что сделал:
Кликните здесь для просмотра всего текста
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Chart1_GetToolTipText(sender As System.Object, e As System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs) Handles Chart1.GetToolTipText
        On Error Resume Next
        Dim sts As Boolean
        Dim txt As String = ""
        Dim htResult As HitTestResult = e.HitTestResult
        If htResult.PointIndex = -1 OrElse htResult.Series Is Nothing Then
            sts = False
        Else
            sts = True
        End If
        Me.ChartToolTip.Active = sts
 
        If sts Then
            txt = e.HitTestResult.Series.Points(e.HitTestResult.PointIndex).Tag.split(vbCrLf)(0)
            For Each ser As Series In Chart1.Series
                txt &= vbCrLf & ser.Points(e.HitTestResult.PointIndex).LegendText
                txt &= " = " & ser.Points(e.HitTestResult.PointIndex).Tag.split(vbCrLf)(1)
            Next
            ChartToolTip.Show(txt, Chart1, e.X, e.Y + 20)
        End If
    End Sub
1
Миниатюры
Построение графика по данным из БД  
11.09.2016, 11:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2016, 11:57
Привет! Вот еще темы с ответами:

Построение простейшего графика. - Visual Basic .NET
Пришлось писать прогу на Vb.net. До этого я юзал Vb6 и проблем с построением простых графиков там не было. Насколько я знаю в Vb.net...

Построение графика с DrawBezier - Visual Basic .NET
Доброго времени суток, пишу программу, которая решает дифференциальное уравнение, ответом является массив. Сообственно в чем дело, не могу...

Построение графика в PictureBox - Visual Basic .NET
Здравствуйте! Передо мной стоит следующая задача: Построение графики функции по точкам. Вывод полученного графика во вкладку...

Построение графика с помощью TrackBar - Visual Basic .NET
Подскажите как изменить данный код для построения графика не с помощью кликом мышки а изменением положения TrackBar ? Imports...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru