2

の行にいくつか問題がありますDataGridView

背景情報:(DataGridView)はの1DataGridViewCalibTabPageにありTabControl、DataGridViewのいくつかの列は、いくつかの列があるため、自動的になりDataGridViewCheckBoxColumnます。これは、VisualStudio2008を使用してVB.Netで記述されたWindowsフォームです。ユーザーは入力データファイルをロードします。DataSourceBoolean

問題点:

1)に最初に到着するとTabPageShowDataGridViewCalib(以下のコード)が呼び出されます。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が原因であるかについてのヒントをいただければ幸いです。DataGridViewDataSource

コード:

    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つの代替方法があります。最初の試み(ここでコメント)はおそらく「最も素晴らしい」ものです。

プログラミングフォーラムに質問を投稿するのはこれが初めてです。はっきりと表現できなかった場合は、もう一度質問してください。

4

2 に答える 2

0

設定することで解決した2番目の問題

DataGridViewCalib.DataSource=Nothing

新しいファイルをロードする前にフォームとデータをクリアしたとき。

ここにも追加の返信がありますhttp://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574

アランド・リーからの言葉

あなたの説明によると、2 つの問題には共通点があります。Visible プロパティを設定しましたが、反応しませんでした。原因のほとんどは、DataGridView で行の Visible プロパティを設定した後、データ ソースが再度バインドされることです。たとえば、Visible プロパティを false に設定してすべての行を非表示に設定し、それらが非表示であることを期待します。ただし、Visible プロパティを設定して行を再作成すると、データ ソースが再びバインドされる可能性があります。古い行は破棄されるため、設定は反応しません。新しい行が初期化され、それらの Visible プロパティが true になります。したがって、行は引き続き表示されます。DataBindingComplete イベントを追跡することで、データ ソース バインドを追跡できます。そのイベントにハンドラーを追加して、メッセージを表示できます。その後、データ ソースが再度バインドされているかどうかがわかります。

ナイル川

于 2009-08-05T11:38:37.120 に答える
0

プログラムが説明どおりに動作した理由はまだわかりませんが、回避策があります。とにかく、DataTable私が表示しているのは、実際に表示したいDataTable2つの異なる列を組み合わせた一時的なものです。DataTablesしたがってDataTableDataGridView. イベントを通じて、一時的な変更を元 CellValueChangedの変更に渡します。DataTableDataTables

于 2009-08-05T06:35:00.070 に答える