2009-07-30 19 views
2

DataGridViewの行にいくつか問題があります。DataGridViewの問題。非表示の行が表示され、DataSourceがあるのにDataGridViewが空です。

背景情報:DataGridViewDataGridViewCalib)はDataGridViewのいくつかの列が自動的にDataGridViewCheckBoxColumnDataSource通りである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てすべての行にもかかわらず があることを示しています。

checkboxCbUniformからそれを強制することによって、サブルーチンShowDataGridViewCalib二度目の実行、行の数の減少は、それが必要として動作し、DataGridViewCalib.Displayed...Countが正しいです。

DataTableは初めて表示される原因は何ですか?

2)ユーザーは、別の入力データファイルを読み込むことができます。 2番目の入力ファイルがロードされ、ShowDataGridViewCalibが実行されると、別の奇妙なことが起こります。 DataGridViewCalib.DataSource = {System.Data.DataTable}このDataTabledtCatchCalib、 しかし

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 

コードの行を処理する二つの別の方法があります。最初の試み(ここでコメントされています)はおそらく "最も素敵"です。

私はプログラミングフォーラムに質問を投稿するのは初めてです。もし私が私のことをきれいに表現していなければ、私にもう一度お尋ねください。

+0

私はちょうどここhttp://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574 同じ質問を投稿しました私があるフォーラムで答えを得たら、他の4人のフォーラムにそのリンクを提供します。 –

答えて

0

私はまだプログラムが記述されているように振る舞った理由を知りませんが、回避策があります。 DataTable私が実際に表示したいと思う2つの異なるDataTablesからの列を組み合わせて、私は何とか一時的にDataTableを表示しています。したがって、この一時的なDataTableの行は、DataGridViewではなく、すでに削除されています。CellValueChangedイベントを通じて、私は一時的なDataTableの変更を元のDataTablesに渡しています。

0

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

DataGridViewCalib.DataSource=Nothing 

を設定することで解決し第二の問題。

は、私はまた、二つの問題が共通の特徴を持っているあなたの説明に基づいて

を言って、ここhttp://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574オーランドリーから

のadditonal返事を持っている:私たちは、Visibleプロパティを設定しなかったが、それはやりました反応しない。原因は、DataGridViewの行のVisibleプロパティを設定した後で、データソースが再度バインドされることが主な原因です。たとえば、すべての行を非表示にするには、それらのVisibleプロパティをfalseに設定し、非表示にすることを期待します。しかし、Visibleプロパティを設定して行を再作成した後に、データソースが再度バインドされることがあります。古い行は、設定が反応しないように配置されています。新しい行が初期化され、Visibleプロパティがtrueになります。したがって、行は引き続き表示されます。 DataBindingCompleteイベントを追跡することによって、データソースバインディングをトレースできます。そのイベントにハンドラを追加して、メッセージを表示することができます。次に、データソースが再度バインドされているかどうかを確認します。

ナイル

+0

REでない場合は 'BindingSource'を使う価値があります:http://stackoverflow.com/a/14501458/427684 – Coops

関連する問題