質問
2020年11月19日木曜日 3:04
お世話になります。黒と申します。
開発環境はvb.net(VS2015),win10です。
No、荷重、時間、速度といった項目を計算して、データテーブル経由してデータグリッドビューに表示させていますが、
1回目の処理ではエラーが出ないのですが、2回目の処理でエラーが発生して困っています。(先週は出ていなかった。)
最初はデータテーブルに項目を追加しているのところで、2回目の処理でデータテーブルをCLEARしても項目だけ残ってしまいエラーが発生しました。RESETも試したのですが、データテーブルに処理した値を配置するのはできましたが、データグリッドビューに配置しても項目行と空の1行だけの表示になってしまったので、CLEARに戻して項目追加の部分を2回目以降は飛ばすようにしました。データテーブルへの配置は問題ないのですが、データグリッドビューへの配置「文字をセルの中央に配置する」というコードでインデックスの範囲を超えていますというメッセージが出てきて困っています。このエラーの詳細はどのように読み解けは良いのかアドバイスを頂けると助かります。
データグリッドビューをクリアしているのですが、中が空になっているのか確認する方法はありますか?データグリッドビューのコードでエラーが発生します。
下にコードを書きます。
Private Sub btnLoadStageCalc_Click(sender As Object, e As EventArgs) Handles btnLoadStageCalc.Click
SCB ;= 1 ’2回目以降にエラーが発生するので、処理してる数を覚えさせてる。本日追加
dt.Clear()
tbm.Clear()
NextLoadNum = 0
HLNum = 0
dankaiNum = 0
LB_dakaiNum.Text = NextLoadNum
Dim IncreaLoadNum As Single
'DataGridViewの初期化
DataGridView1.Columns.Clear()
Dim columns As Integer
Dim rows, q As Integer
Dim loadpitch, Manu_target As Integer
' データテーブルを作成
Dim amari As Boolean
amari = False
loadpitch = CInt(tbLoadpitch.Text)
Manu_target = CInt(tbManu_target.Text)
If tbManu_target.Text = "" Then
MsgBox("目標荷重を入力してください")
Exit Sub
End If
If tbLoadpitch.Text = "" Then
MsgBox("荷重ピッチを入力して下さい")
Exit Sub
End If
IncreaLoadNum = Math.Floor(CSng(tbManu_target.Text) / CSng(tbLoadpitch.Text))
Console.WriteLine("荷重段階数は" & IncreaLoadNum)
k = IncreaLoadNum * 2 ; 1
If Manu_target - (IncreaLoadNum * loadpitch) >= 3 Then
amari = True
k = IncreaLoadNum * 2 ; 3
Else
amari = False
End If
If SCB = 1 Then (本日エラー発生)
'項目の作成
dt.Columns.Add("No")
dt.Columns.Add("Load")
dt.Columns.Add("WaitingTime")
dt.Columns.Add("ChangeTime")
Else
End If
'0行目
dtRow = dt.NewRow
dtRow("No") = 0
dtRow("Load") = 0
dtRow("WaitingTime") = 0
dtRow("ChangeTime") = 0
'行追加
dt.Rows.Add(dtRow)
'1行目
For x = 1 To k
If amari = False Then
If x <= IncreaLoadNum Then
dtRow = dt.NewRow
dtRow("No") = x
dtRow("Load") = x * loadpitch
dtRow("WaitingTime") = tbKeisokuhoji.Text
dtRow("ChangeTime") = tbhenkoujikan.Text
'行追加
dt.Rows.Add(dtRow)
Else
dtRow = dt.NewRow
dtRow("No") = x
dtRow("Load") = Manu_target - ((x - IncreaLoadNum) * loadpitch)
dtRow("WaitingTime") = tbKeisokuhoji.Text
dtRow("ChangeTime") = tbhenkoujikan.Text
'行追加
dt.Rows.Add(dtRow)
End If
Else '最大荷重が割り切れない時
If x <= IncreaLoadNum Then
dtRow = dt.NewRow
dtRow("No") = x
dtRow("Load") = x * loadpitch
dtRow("WaitingTime") = tbKeisokuhoji.Text
dtRow("ChangeTime") = tbhenkoujikan.Text
'行追加
dt.Rows.Add(dtRow)
ElseIf x = IncreaLoadNum ; 1 Then '割り切れない時の最大荷重
dtRow = dt.NewRow
dtRow("No") = x
dtRow("Load") = Manu_target
dtRow("WaitingTime") = tbKeisokuhoji.Text
dtRow("ChangeTime") = tbhenkoujikan.Text
'行追加
dt.Rows.Add(dtRow)
ElseIf x > IncreaLoadNum ; 1 Then
dtRow = dt.NewRow
dtRow("No") = x
dtRow("Load") = IncreaLoadNum * loadpitch - loadpitch * (x - (IncreaLoadNum ; 2))
dtRow("WaitingTime") = tbKeisokuhoji.Text
dtRow("ChangeTime") = tbhenkoujikan.Text
'行追加
dt.Rows.Add(dtRow)
End If
End If
Next
'**********************************************************
'*
'* データグリッドビューに;納
'*
If SCB = 1 Then(本日エラー発生)
With tbm.Columns
.Add("No", GetType(Integer))
.Add("荷重 (kN)", GetType(Single))
.Add("保持時間(秒)", GetType(Integer))
.Add("変更時間(秒)", GetType(Integer))
End With
Else
End If
For i As Integer = 0 To k - 1
'テーブルからデータを取得
No = CType(dt.Rows.Item(i)(0), Integer)
L = CType(dt.Rows.Item(i)(1), Single)
T = CType(dt.Rows.Item(i)(2), Integer)
Speed = CType(dt.Rows.Item(i)(3), Integer)
tbm.Rows.Add(No, L, T, Speed)
Next
DataGridView1.DataSource = tbm
DataGridView1.Height = (k * 35) ; 31
Me.DataGridView1.Columns(0).Width = 80
Me.DataGridView1.Columns(1).Width = 160
Me.DataGridView1.Columns(2).Width = 220
Me.DataGridView1.Columns(3).Width = 220
'列ヘッダーの高さが自動調整されるようにする
DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize
'すべての列ヘッダーの高さを自動調整する
DataGridView1.AutoResizeColumnHeadersHeight()
'ヘッダーとすべてのセルの内容に合わせて、行の高さを自動調整する
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
If SCB = 1 Then(本日エラー発生)
'"Column1"列のセルのテキストの配置を上下左右とも中央にする
DataGridView1.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
DataGridView1.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
DataGridView1.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
DataGridView1.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
'"Column1"列のヘッダーのテキストの配置を上下左右とも中央にする
DataGridView1.Columns(0).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
DataGridView1.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
DataGridView1.Columns(2).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
DataGridView1.Columns(3).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
Else
End If
'列ヘッダーの背景色を黄色にする
DataGridView1.Rows(0).DefaultCellStyle.BackColor = Color.Yellow
DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Yellow
'列ヘッダーを非表示にする
DataGridView1.RowHeadersVisible = False
' 選択されているセルをなくす
DataGridView1.CurrentCell = Nothing
DataGridView1.ScrollBars = ScrollBars.Vertical
' Me.DataGridView1.VerticalScrollBarWidth As integer = 10
'DataGridView1にユーザーが新しい行を追加できないようにする
DataGridView1.AllowUserToAddRows = True
'インデックス0の行のセルの背景色を薄い灰色にする
' Stop
End Sub
画エラーの詳細
{System.ArgumentOutOfRangeException: インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
" & vbCrLf & "パラメーター名:index" & vbCrLf & " 場所 System.Collections.ArrayList.get_Item(Int32 index)" & vbCrLf & "
場所 System.Windows.Forms.DataGridViewColumnCollection.get_Item(Int32 index)" & vbCrLf & "
場所 MDT22.Form1.btnLoadStageCalc_Click(Object sender, EventArgs e)
場所 C:\Users\masah\Desktop\VB開発\MDT22.SS(テスト) 6ch moto\Form1.vb:行 3007" & vbCrLf & "
場所 System.Windows.Forms.Control.OnClick(EventArgs e)" & vbCrLf & "
場所 System.Windows.Forms.Button.OnClick(EventArgs e)" & vbCrLf & "
場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)" & vbCrLf & "
場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)" & vbCrLf & "
場所 System.Windows.Forms.Control.WndProc(Message& m)" & vbCrLf & "
場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)" & vbCrLf & "
場所 System.Windows.Forms.Button.WndProc(Message& m)" & vbCrLf & "
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)" & vbCrLf & "
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)" & vbCrLf & "
場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)" & vbCrLf & "
場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)" & vbCrLf & "
場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)" & vbCrLf & "
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)" & vbCrLf & "
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)" & vbCrLf & "
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()" & vbCrLf & "
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()" & vbCrLf & "
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)" & vbCrLf & "
場所 MDT22.My.MyApplication.Main(String[] Args) 場所 :行 81" & vbCrLf & "
場所 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)" & vbCrLf & "
場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)" & vbCrLf & "
場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()" & vbCrLf & "
場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)" & vbCrLf & "
場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)" & vbCrLf & "
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)" & vbCrLf & "
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)" & vbCrLf & "
場所 System.Threading.ThreadHelper.ThreadStart()}
すべての返信 (6)
2020年11月19日木曜日 3:34
そもそもの話というか、表示する列が変わらないのなら、ColumnsをClearしてAddしなおしたりしないで、それこそデザイナで作っちゃうなどして後はそれを触らなければいいのではないでしょうか。
2020年11月19日木曜日 4:42
Hongliang様
返信ありがとうございます。
知識が無いので、エクセルみたいな表を作ってそれを読み取るってなると真っ先にdatagridviewという頭にしかなりませんでした。デザイナとは何でしょうか?調べてみます。
2020年11月19日木曜日 4:57
>>表示する列が変わらないのなら、ColumnsをClearしてAddしなおしたりしないで、それこそデザイナで作っちゃうなどして後はそれを触らなければいいのではないでしょうか。
> デザイナとは何でしょうか?調べてみます。
以下の記事が判りやすいかも知れません。C#ですが列の追加方法は VBと変わりません。
DataGridViewの基本的な使い方。C#で行の追加をする方法
本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は フォーラムでご質問頂くにあたっての注意点 をご覧ください。
2020年11月19日木曜日 5:15
余談ですが、本質問は Visual Basic for Application(VBA) ではなく、Visual Basic フォーラムが妥当と思われます。
本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は フォーラムでご質問頂くにあたっての注意点 をご覧ください。
2020年11月19日木曜日 5:18
正しいフォーラムを選んで投稿してください。VBA は間違ってます。
用語を正しく使ってください。DataGridView, DataTable などカタカナ書きは NG です。
2020年11月30日月曜日 6:23
ひらぽん様
アドバイスありがとうございました。
VB.netで質問したつもりでしたが、VBAになっておりました。
すみません。
エラーはとりあえず解決しました。
いろいろダメでしたが、DataGridView1.Columns.Clear()が悪さをしているみたいで
これを除去したらなんとかなりました。