前提・実現したいこと
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
下記でどうでしょうか?
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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/10/14 08:10
記載し忘れてしまったのですが
DataGridViewの値はその時々で変化するのでグラフに表示させる時に可変できるようにしておかないといけないのです
ただ単に何かのタイミングで可変する数値をボタンでその都度変更するみたいな感じです
2017/10/14 08:54
ただし、数字を入れる部分は文字が入るとエラーになるので、
下記のサイトを参考に入力制限をすることになります。
http://dobon.net/vb/dotnet/datagridview/textboxevent.html
2017/10/24 09:44
私的にごたごたしてしまい
お返事遅れてしまいました大変申し訳ありません
教えて頂いたプログラムなのですが
思ったような挙動が実装が出来ませんでした
(途中までは上手く表示されているのですが…)
私的な事が一段落次第もう少し自分なりに考えてみます
親身に考えて頂きありがとうございます