質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.22%

visual basic 2015  DataGridViewから出た数値又は任意の数値をChart(グラフ)に代入、グラフを表示させたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 7,685

techno

score 22

前提・実現したいこと

buttonを押すとDataGridViewの数値をChart(グラフ)に代入、グラフを表示させたいです
下記の写真参照

ここのサイトを参照させていただきました
http://blog.hiros-dot.net/?p=2123

最初からデータが分かっていれば上記のようなサイトのプログラムのままでいいとは思うのですが任意のとなると変数に置き換えたりちゃんとした記述でないと上手く反映されないです

やりたいことは
ボタンを押したらDataGridViewの数値をグラフに表示させたい

DataGridViewの値はその時々で変化するのでボタンを押してグラフに表示させる時に可変できるようにしたいです

イメージ説明

手本にさせて頂いているサイト様のプログラム

Public Class Form1


    ' フォームロード時の処理
    Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        '初期化
        Chart1.Series.Clear()

        'データの取得
        Dim ds As DataSet = GetData()

        'Chartコントロールにデータソースを設定
        Chart1.DataSource = ds

        'Chartコントロールにタイトルを設定
        Chart1.Titles.Add("アクセス数とユニークユーザー数")

        'グラフの種類,系列,軸の設定
        For I As Integer = 1 To ds.Tables(0).Columns.Count - 1
            '列名の取得
            Dim columnName As String = ds.Tables(0).Columns(I).ColumnName

            '系列の設定
            Chart1.Series.Add(columnName)

            'グラフの種類
            Chart1.Series(columnName).ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column


            'X軸
            Chart1.Series(columnName).XValueMember = ds.Tables(0).Columns(0).ColumnName.ToString
            Chart1.ChartAreas(0).AxisX.MajorGrid.Enabled = False
            Chart1.ChartAreas(0).AxisX.MinorGrid.Enabled = False

            'Y軸
            Chart1.Series(columnName).YValueMembers = columnName
        Next

        'X軸タイトル
        Chart1.ChartAreas(0).AxisX.Title = "月"

        Chart1.DataBind()
    End Sub

    ' データの設定
    Private Function GetData() As DataSet
        Dim ds As New DataSet
        Dim dt As New DataTable
        Dim dtRow As DataRow

        '列の作成
        dt.Columns.Add("月", Type.GetType("System.String"))
        dt.Columns.Add("アクセス数", Type.GetType("System.Int32"))
        dt.Columns.Add("ユニークユーザー数", Type.GetType("System.Int32"))
        ds.Tables.Add(dt)




        ★★★'データの追加★★★
        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "2011/01"
        dtRow(1) = "945"
        dtRow(2) = "4203"
        ds.Tables(0).Rows.Add(dtRow)

        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "2011/02"
        dtRow(1) = "1023"
        dtRow(2) = "3302"
        ds.Tables(0).Rows.Add(dtRow)

        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "2011/03"
        dtRow(1) = "2121"
        dtRow(2) = "7065"
        ds.Tables(0).Rows.Add(dtRow)

        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "2011/04"
        dtRow(1) = "2179"
        dtRow(2) = "7753"
        ds.Tables(0).Rows.Add(dtRow)

        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "2011/05"
        dtRow(1) = "2063"
        dtRow(2) = "6373"
        ds.Tables(0).Rows.Add(dtRow)

        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "2011/06"
        dtRow(1) = "2107"
        dtRow(2) = "4210"
        ds.Tables(0).Rows.Add(dtRow)

        Return (ds)
    End Function

End Class

上記のプログラムの結果

イメージ説明

試したこと

上記の星印
★★★'データの追加★★★の
dtRow(0) = "2011/01"    
dtRow(1) = "945"
dtRow(2) = "4203"

上記の数値や表記を変えると棒グラフの長さや表示が変わるのが分かるのですが
任意の場所から引っ張ってくる時にそれを変数に置き換えたりして代入したのですが必要な記述が足りないのか記述の仕方が間違っているのかエラーになならないですが反映されないです

他のSUBルーチンから数値情報をもってくるので「Private」ではなく 「Public」にしてみたのですがいかんせんまだまだ初心者の域を脱していないのでどこをどうすればいいかの検討すらわからずこのサイトに質問した次第です

最近少しづつですが変数というものを理解しIF文やDoループなどが読めば少しは分かるようになっては来ましたがまだまだです
どなたかご教授願えたらと思います
よろしくお願い致します

試したこと2

自分なりに試したこと
(*例なのでデータは三種類ありますがこのプログラムは一種類しか記述してません)

①変数に代入置き換え

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

dtRow(0) = DataGridView(0.0).value
dtRow(1) = DataGridView(1.0).value

End Sub

又は

dim AAA as staring = DataGridView(0.0).value   '名前
dim BBB as integer = DataGridView(1.0).value  '回数

②変数に置き換えワンクッション置く
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

dtRow(0) = AAA
dtRow(1) = BBB

End Sub

置き換えたり間接的に置き換えたりしたのですができませんでした

補足情報(言語/FW/ツール等のバージョンなど)

visual basic 2015
VB.net

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

下記でどうでしょうか?

Form_Load時のイベントとButton1_Click時のイベントの処理の順番を入れ替える必要があります。
Form_Loadは起動時に、Button1_Clickはボタンを押したタイミングで実行されます。

Public Class Form1

    ' フォームロード時の処理
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        'グリッドの定義
        DataGridView1.ColumnCount = 2
        DataGridView1.Columns(0).HeaderText = "名前"
        DataGridView1.Columns(0).Name = "名前"
        DataGridView1.Columns(1).HeaderText = "個数"
        DataGridView1.Columns(1).Name = "個数"

        Chart1.Series.Clear()

    End Sub

    ' データの設定
    Private Function GetData() As DataSet

        Dim ds As New DataSet
        Dim dt As New DataTable
        Dim dtRow As DataRow

        '列の作成
        dt.Columns.Add("月", Type.GetType("System.String"))
        dt.Columns.Add("アクセス数", Type.GetType("System.Int32"))
        dt.Columns.Add("ユニークユーザー数", Type.GetType("System.Int32"))
        ds.Tables.Add(dt)


        '★★★データの追加★★★
        For i = 0 To DataGridView1.Rows.Count - 2
            dtRow = ds.Tables(0).NewRow
            dtRow(0) = DataGridView1(0, i).Value
            dtRow(1) = DataGridView1(1, i).Value
            ds.Tables(0).Rows.Add(dtRow)
        Next

        Return (ds)

    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        'データの取得
        Dim ds As DataSet = GetData()

        'Chartコントロールにデータソースを設定
        Chart1.DataSource = ds

        '初期化
        Chart1.Series.Clear()

        'Chartコントロールにタイトルを設定
        Chart1.Titles.Clear()
        Chart1.Titles.Add("アクセス数とユニークユーザー数")

        'グラフの種類,系列,軸の設定
        For I As Integer = 1 To ds.Tables(0).Columns.Count - 1
            '列名の取得
            Dim columnName As String = ds.Tables(0).Columns(I).ColumnName

            '系列の設定
            Chart1.Series.Add(columnName)

            'グラフの種類
            Chart1.Series(columnName).ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column


            'X軸
            Chart1.Series(columnName).XValueMember = ds.Tables(0).Columns(0).ColumnName.ToString
            Chart1.ChartAreas(0).AxisX.MajorGrid.Enabled = False
            Chart1.ChartAreas(0).AxisX.MinorGrid.Enabled = False

            'Y軸
            Chart1.Series(columnName).YValueMembers = columnName
        Next

        'X軸タイトル
        Chart1.ChartAreas(0).AxisX.Title = "月"

        'Datasetにバインド
        Chart1.DataBind()

    End Sub

    Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        '表示されているコントロールがDataGridViewTextBoxEditingControlか調べる
        If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
            Dim dgv As DataGridView = CType(sender, DataGridView)

            '編集のために表示されているコントロールを取得
            Dim tb As DataGridViewTextBoxEditingControl =
                CType(e.Control, DataGridViewTextBoxEditingControl)

            'イベントハンドラを削除
            RemoveHandler tb.KeyPress, AddressOf DataGridView1_KeyPress

            '該当する列か調べる
            If dgv.CurrentCell.OwningColumn.Name = "個数" Then
                'KeyPressイベントハンドラを追加
                AddHandler tb.KeyPress, AddressOf DataGridView1_KeyPress
            End If
        End If
    End Sub

    Private Sub DataGridView1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles DataGridView1.KeyPress
        '数字しか入力できないようにする
        If e.KeyChar < "0"c Or e.KeyChar > "9"c Then
            e.Handled = True
        End If
    End Sub
End Class

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/14 08:10

    回答して頂いてありがとうございます
    記載し忘れてしまったのですが
    DataGridViewの値はその時々で変化するのでグラフに表示させる時に可変できるようにしておかないといけないのです

    ただ単に何かのタイミングで可変する数値をボタンでその都度変更するみたいな感じです

    キャンセル

  • 2017/10/14 08:54

    上記のコードでどうでしょうか?
    ただし、数字を入れる部分は文字が入るとエラーになるので、
    下記のサイトを参考に入力制限をすることになります。

    http://dobon.net/vb/dotnet/datagridview/textboxevent.html

    キャンセル

  • 2017/10/24 09:44

    soma62jpさん
    私的にごたごたしてしまい
    お返事遅れてしまいました大変申し訳ありません

    教えて頂いたプログラムなのですが
    思ったような挙動が実装が出来ませんでした
    (途中までは上手く表示されているのですが…)
    私的な事が一段落次第もう少し自分なりに考えてみます
    親身に考えて頂きありがとうございます

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • VBに関する質問
  • visual basic 2015  DataGridViewから出た数値又は任意の数値をChart(グラフ)に代入、グラフを表示させたい