DataGridView
の行にいくつか問題があります。DataGridViewの問題。非表示の行が表示され、DataSourceがあるのにDataGridViewが空です。
背景情報:DataGridView
(DataGridViewCalib
)はDataGridViewのいくつかの列が自動的にDataGridViewCheckBoxColumn
DataSource
通りであるBoolean
をいくつかcolumsを有する、TabControl
の一つTabPage
です。これはVisual Studio 2008でVB.Netで書かれたWindowsフォームです。ユーザーは入力データファイルを読み込みます。
問題:
1)TabPage
の最初の到着時に、ShowDataGridViewCalib
以下(コード)と呼ばれます。一部の行が表示されないようにするコードがあるにもかかわらず、すべての行がDataGridView
に表示されます。コード内のブレークポイントは、コードがRows.Visible = False
イベントに到着することを示しています。予想通り
DataGridViewCalib.DisplayedColumnCount(True)=0
DataGridViewCalib.DisplayedColumnCount(False=0)
DataGridViewCalib.DisplayedRowCount(True)=0
DataGridViewCalib.DisplayedRowCount(False)=0
Columns.Visible=False
が作品:デバッガでウォッチを示すbeeingてすべての行にもかかわらず があることを示しています。
checkbox
CbUniform
からそれを強制することによって、サブルーチンShowDataGridViewCalib
二度目の実行、行の数の減少は、それが必要として動作し、DataGridViewCalib.Displayed...Count
が正しいです。
DataTable
は初めて表示される原因は何ですか?
2)ユーザーは、別の入力データファイルを読み込むことができます。 2番目の入力ファイルがロードされ、ShowDataGridViewCalib
が実行されると、別の奇妙なことが起こります。 DataGridViewCalib.DataSource = {System.Data.DataTable}
このDataTable
はdtCatchCalib
、 しかし
DataGridViewCalib.Columns.Count = 0
DataGridViewCalib.Rows.Count = 0
と同じ性質を持っており、何もDataGridView
に示されていません。 2番目の入力ファイルがロードされる前に、ほとんどのデータがクリアされます(DataGridViewCalib.Columns.Clear()
およびdtCatchCalib.Clear()
を含む)。特にこの2番目の問題については、エラーがShowDataGridViewCalib
の外にあると仮定していますが、DataGridView
にはDataSource
がありますが、行と列はありません。
コード:
Private Sub ShowDataGridViewCalib()
'[...]
Dim kolwidth As Integer = 77
DataGridViewCalib.DataSource = dtCatchCalib
DataGridViewCalib.Refresh()
Dim kol As DataGridViewColumn
For Each kol In DataGridViewCalib.Columns
kol.SortMode = DataGridViewColumnSortMode.NotSortable
If CbUniform.Checked = False Then
kol.Visible = True
kol.Width = kolwidth
If kol.Name = "CatchmentID" Then
kol.ReadOnly = True
ElseIf kol.Name = "parc0" Then
kol.HeaderText = "c0"
ElseIf kol.Name = "statr" Then
kol.Visible = False
kol.ReadOnly = True
kol.HeaderText = "r"
End If
Else
If kol.Name = "IncludeObs" Then
kol.Width = kolwidth
ElseIf kol.Name = "CatchmentID" Then
kol.ReadOnly = True
kol.Width = kolwidth
Else
kol.Visible = False
End If
End If
Next
'Dim rad As DataGridViewRow
'Dim dum As Integer
'dum = 0
'For Each rad In DataGridViewCalib.Rows
' dum += 1 ' # rows in dtCatchCalib is = # subcatchments
' DataGridViewCalib.CurrentCell = Nothing ' Unselect the current cell, needed to be able to set the row invisible
' rad.Visible = False ' TEST
' If ObsLst(dum) = True Then ' ObsLst have its first value at index 1
' rad.Visible = True
' Else
' DataGridViewCalib.CurrentCell = Nothing ' Unselect the current cell, needed to be able to set the row invisible
' rad.Visible = False
' End If
'Next
For i = 0 To dtCatchCalib.Rows.Count - 1
DataGridViewCalib.CurrentCell = Nothing
DataGridViewCalib.Rows(i).Visible = False
If ObsLst(i+1) = True Then ' ObsLst have its first value at index 1
DataGridViewCalib.Rows(i).Visible = True
Else
DataGridViewCalib.CurrentCell = Nothing
DataGridViewCalib.Rows(i).Visible = False
End If
Next
'[...]
End Sub
コードの行を処理する二つの別の方法があります。最初の試み(ここでコメントされています)はおそらく "最も素敵"です。
私はプログラミングフォーラムに質問を投稿するのは初めてです。もし私が私のことをきれいに表現していなければ、私にもう一度お尋ねください。
私はちょうどここhttp://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574 同じ質問を投稿しました私があるフォーラムで答えを得たら、他の4人のフォーラムにそのリンクを提供します。 –