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

  • 質問

  • お世話になります。黒と申します。

    開発環境は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()}

    2020年11月19日 3:04

すべての返信

  • そもそもの話というか、表示する列が変わらないのなら、ColumnsをClearしてAddしなおしたりしないで、それこそデザイナで作っちゃうなどして後はそれを触らなければいいのではないでしょうか。
    2020年11月19日 3:34
  • Hongliang様

    返信ありがとうございます。

    知識が無いので、エクセルみたいな表を作ってそれを読み取るってなると真っ先にdatagridviewという頭にしかなりませんでした。デザイナとは何でしょうか?調べてみます。

    2020年11月19日 4:42
  • >>表示する列が変わらないのなら、ColumnsをClearしてAddしなおしたりしないで、それこそデザイナで作っちゃうなどして後はそれを触らなければいいのではないでしょうか。

    デザイナとは何でしょうか?調べてみます。

    以下の記事が判りやすいかも知れません。C#ですが列の追加方法は VBと変わりません。

    DataGridViewの基本的な使い方。C#で行の追加をする方法


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は フォーラムでご質問頂くにあたっての注意点 をご覧ください。

    2020年11月19日 4:57
  • 余談ですが、本質問は Visual Basic for Application(VBA) ではなく、Visual Basic フォーラムが妥当と思われます。


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は フォーラムでご質問頂くにあたっての注意点 をご覧ください。

    2020年11月19日 5:15
  • 正しいフォーラムを選んで投稿してください。VBA は間違ってます。

    用語を正しく使ってください。DataGridView, DataTable などカタカナ書きは NG です。

    2020年11月19日 5:18
  • ひらぽん様

    アドバイスありがとうございました。

    VB.netで質問したつもりでしたが、VBAになっておりました。

    すみません。

    エラーはとりあえず解決しました。

    いろいろダメでしたが、DataGridView1.Columns.Clear()が悪さをしているみたいで

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

    2020年11月30日 6:23