1

実行時に生成しているdatagridviewコントロールの列を非表示にするのに問題があります。既存のタブコントロールのランタイム生成タブページ内でそのコントロールを生成しています。私のコードは次のとおりです。

Try
    Do
        If m_DataTable.Columns.Contains("Checkpoint " & intCheckPointNumber & " Time") Then
            Dim tabNewCheckpoint As New TabPage
            Dim dgvNewCheckpoint As New DataGridView

            tabNewCheckpoint.Name = "tabCheckpoint" & intCheckPointNumber
            tabNewCheckpoint.Text = "Checkpoint " & intCheckPointNumber
            tabctrlTimingTable.TabPages.Add(tabNewCheckpoint)

            dgvNewCheckpoint.Name = "dgvCheckpoint" & intCheckPointNumber
            dgvNewCheckpoint.DataSource = m_DataTable
            dgvNewCheckpoint.Size = dgvTimingP2P.Size
            tabNewCheckpoint.Controls.Add(dgvNewCheckpoint)

            Try
                strColumnName = "Checkpoint " & intCheckPointNumber
                For Each col As DataColumn In m_DataTable.Columns
                    MessageBox.Show(col.ColumnName)
                    If col.ColumnName.StartsWith("Checkpoint") Then
                        If Not col.ColumnName.StartsWith(strColumnName) Then
                            dgvNewCheckpoint.Columns(col.ColumnName).Visible = False
                        End If
                    End If
                Next
            Catch
                MessageBox.Show(ErrorToString)
            End Try
        Else
            Exit Do
        End If
        intCheckPointNumber += 1
    Loop
Catch ex As Exception
    'MessageBox.Show(ErrorToString)
End Try

col.ColumnName値はデータベースの列に直接対応しますが、次の行の直後にエラーが生成されます。

dgvNewCheckpoint.Columns(col.ColumnName).Visible = False

私が繰り返し発生するエラーは、「オブジェクト参照がオブジェクトのインスタンスに設定されていない」です。

このコードは、すべて設計時に作成されたタブコントロールの別のタブページ内にあるdatagridviewコントロールに対して正常に機能します。

ランタイムで生成されたdatagridviewを作成した直後に列を非表示にしようとすると問題がありますか?

VB2010を使用しています。

私はもともと次のコードを使用していました:

For Each col As DataGridViewColumn In dgvNewCheckpoint.Columns
MessageBox.Show(col.Name)
    If col.Name.StartsWith("Checkpoint") Then
        If Not col.Name.StartsWith(strColumnName) Then
            col.Visible = False
        End If
    End If
Next

私がここで抱えている問題は、dgvNewCheckpoint datagridviewコントロールにDataGridViewColumnsが表示されてはならないため、プログラムがこのFor...Nextループをスキップすることです。データベースの列を参照するように変更すると、実際に結果が得られました。ここで列を誤って参照していますか?

4

1 に答える 1

1

データテーブルにバインドする前に、DGVをコントロールリストに追加する必要があります。したがって、線は次のように移動する必要があります。

Dim tabNewCheckpoint As New TabPage
Dim dgvNewCheckpoint As New DataGridView

tabNewCheckpoint.Name = "tabCheckpoint" & intCheckPointNumber
tabNewCheckpoint.Text = "Checkpoint " & intCheckPointNumber
tabctrlTimingTable.TabPages.Add(tabNewCheckpoint)

tabNewCheckpoint.Controls.Add(dgvNewCheckpoint) 'This is the line to be moved

dgvNewCheckpoint.Name = "dgvCheckpoint" & intCheckPointNumber
dgvNewCheckpoint.DataSource = m_DataTable
dgvNewCheckpoint.Size = dgvTimingP2P.Size
于 2012-12-06T23:46:47.443 に答える