次の方法で共有


データグリッドビューの再配置でエラーが起きる

質問

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()が悪さをしているみたいで

これを除去したらなんとかなりました。