の行にいくつか問題がありますDataGridView
。
背景情報:(DataGridView
)はの1DataGridViewCalib
つTabPage
にありTabControl
、DataGridViewのいくつかの列は、いくつかの列があるため、自動的になりDataGridViewCheckBoxColumn
ます。これは、VisualStudio2008を使用してVB.Netで記述されたWindowsフォームです。ユーザーは入力データファイルをロードします。DataSource
Boolean
問題点:
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
期待どおりに動作します。
サブルーチンShowDataGridViewCalib
を2回実行するときは、から強制することによりcheckbox
CbUniform
、行数の削減が正常に機能し、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
コード内の行を処理する2つの代替方法があります。最初の試み(ここでコメント)はおそらく「最も素晴らしい」ものです。
プログラミングフォーラムに質問を投稿するのはこれが初めてです。はっきりと表現できなかった場合は、もう一度質問してください。