2016-06-24 8 views
0

特定のDataTableの内容をDataGridViewに表示/非表示するコードを記述しました。DataGridViewを表示するコードは、前に別のサブを実行した場合にのみ機能します

ボタンをクリックすると、DataGridViewが表示され、消えます。 エラーは表示されませんが、何も表示されません。

しかし、別のボタンをクリックして(他のフォームを表示している)メインフォームに戻ると、コードが機能します。 (?? !! ??)

2番目のコードでは、最初のコードが動作することを理解できませんでした。2つのコード間に接続がないようです。

EDIT
は、私はいくつかのテストをしたと私はより多くの情報を追加することができます。
私は(メッセージボックスで)DataGridViewのプロパティを表示するためにボタンを追加しました。 コントロールが正しく追加され、すべてのプロパティが正しい。 プロパティ "Visible"は "True"に設定されていますが、DataGridViewはまだ "不可視"です。

DGV_Tbl.Visible = FalseDGV_Tbl.Visible = True を設定するボタンを追加しました。クリックすると、DataGridViewが表示されます。

しかし、Btn_ShowHideTblをもう一度(DGVを削除するために)クリックし、再度(DGVを再追加するために)DataGridViewはまだ「不可視」です。

ボタンをクリックして2番目のフォームを開いた後で閉じると、最初のフォームに戻ることはありません。
この場合、すべて正しく動作します。

最初のコードDGV_Tbl.Visible = FalseDGV_Tbl.Visible = Trueを追加して解決できましたが、それは良い考えではありません。
私はこの問題を理解し、 "奇妙な指示"なしで解決したいと考えています。

EDIT 2
私はまた、コード.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)は、第二のフォームを開かずに動作しないことに気づきました。
この場合、DGV_Tbl.Visible = FalseDGV_Tbl.Visible = Trueは効果がありません。

EDIT 3
私は受け入れ答えのように行ってきたが、私は私のコードで間違っているのかを理解することを望ん別の質問hereを掲載。

これは/非表示のDataGridViewを示すために私のコードです:

Private Sub Btn_ShowHideTbl_Click(sender As Object, e As EventArgs) Handles Btn_ShowHideTbl.Click 
    ShowHideTbl() 
End Sub 

Private Sub ShowHideTbl() 
    'Look for DGV 
    Dim DGV_Tbl As DataGridView = Nothing 
    Try 
     DGV_Tbl = CType(Me.Controls("DGV_Tbl"), DataGridView) 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
    Try 
     'If not found I need to show data 
     If DGV_Tbl Is Nothing Then 
      If Me.CBox_ProcType.Text = "Select a Procedure" Then 
       MsgBox("You need To select a Procedure", vbInformation, "Unable to show table") 
       Exit Sub 
      End If 
      DGV_Tbl = New DataGridView 
      'It needs to copy data to another DataTable to show Double as Currency 
      Using DTemp As DataTable = New DataTable 
       Dim TblName As String = Me.CBox_ProcType.Text 
       For C As Integer = 0 To DS_All.Tables(TblName).Columns.Count - 1 
        DTemp.Columns.Add(DS_All.Tables(TblName).Columns(C).ColumnName, Type.GetType("System.String")) 
       Next 
       Dim Arr(DS_All.Tables(TblName).Columns.Count - 1) As String 
       For R As Integer = 0 To DS_All.Tables(TblName).Rows.Count - 1 
        For C As Integer = 0 To DS_All.Tables(TblName).Columns.Count - 1 
         If C = 0 Then 
          Arr(C) = DS_All.Tables(TblName).Rows(R)(C).ToString 
         Else 
          Arr(C) = FormatCurrency(DS_All.Tables(TblName).Rows(R)(C).ToString, 2) 
         End If 
        Next 
        DTemp.Rows.Add(Arr) 
       Next 
       'Working on created DataGridView 
       With DGV_Tbl 
        .Name = "DGV_Tbl" 
        'Add control to the Form 
        Me.Controls.Add(DGV_Tbl) 
        .DataSource = DTemp 
        .AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells) 
        .RowHeadersVisible = False 
        .AllowUserToAddRows = False 
        .AllowUserToDeleteRows = False 
       End With 
      'Dispose the copied DataTable 
      End Using 
      'Resizing Form to include new DataGridView 
      Dim DGV_H As Integer = 0 
      Dim DGV_W As Integer = 0 
      For Each R As DataGridViewRow In DGV_Tbl.Rows 
       DGV_H += R.Height 
      Next 
      DGV_H += DGV_Tbl.ColumnHeadersHeight 
      'Add more space to include spaces between cells 
      DGV_H += CInt(DGV_Tbl.Rows.Count * 0.45) 
      For Each C As DataGridViewColumn In DGV_Tbl.Columns 
       DGV_W += C.Width 
      Next 
      'Add more space to include spaces between cells 
      DGV_W += CInt(DGV_Tbl.Columns.Count * 0.45) 
      DGV_Tbl.Height = DGV_H 
      DGV_Tbl.Width = DGV_W 
      'Resize the Form 
      Me.Height += DGV_H + 30 
      Me.Controls("DGV_Tbl").Location = New Point(15, Me.Height - DGV_H - 30) 
      'Align for currency 
      For x As Integer = 1 To DGV_Tbl.Columns.Count - 1 
       DGV_Tbl.Columns(x).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight 
      Next 
     Else 
      'If DGV exists I need to remove it and resize the form 
      Dim DGV_H As Integer = DGV_Tbl.Height 
      DGV_Tbl.Dispose() 
      Me.Height -= (DGV_H + 30) 
     End If 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
End Sub 

これは、別のフォーム(およびフォームを閉じて戻って行くためのコード)を示し、ボタンのコードです:

Private Sub Btn_ShowSummary_Click(sender As Object, e As EventArgs) Handles Btn_ShowSummary.Click 
    Try 
     If Me.CBox_ProcType.Text = "Select a Procedure" OrElse Me.CBox_ProcValue.Text = "Select a Value" Then 
      MsgBox("It needs to select a Procedure and a Value", 
        vbInformation, "Unable to show table") 
      Exit Sub 
     End If 

     Summary = "...Here Some text..." & vbCrLf & Split(Me.CBox_ProcType.Text, ".")(1).Trim & vbCrLf & vbCrLf 
     Summary &= "...Here Some text..." & Me.CBox_ProcValue.Text & vbCrLf & vbCrLf 
     Dim C1Wdt% = -50 
     Dim C2Wdt% = TBox_TotAll.Text.Length 
     For R As Integer = 1 To 4 
      Dim CBox_Phase As CheckBox = CType(Me.TLP_Phases.Controls("CBox_Phase" & R.ToString), CheckBox) 
      Dim TBox_ValPh As TextBox = CType(Me.TLP_Phases.Controls("TBox_ValPh" & R.ToString), TextBox) 
      If CBox_Phase.Checked Then 
       Summary &= String.Format("{0," & C1Wdt.ToString & "} {1," & C2Wdt.ToString & "}", 
             CBox_Phase.Text, TBox_ValPh.Text) & vbCrLf 
       Dim TBox_SelVarPh As TextBox = CType(Me.TLP_Phases.Controls("TBox_SelVarPh" & R.ToString), TextBox) 
       If TBox_SelVarPh.Text = "" OrElse TBox_SelVarPh.Text = "€ 0,00" Then 
        Summary &= "...Here Some text..." & vbCrLf 
       Else 
        Dim SelVarTxt$ = If(Val(TBox_SelVarPh.Text) > 0, 
         "...Here Some text..." & TBox_SelVarPh.Text, 
         "...Here Some text..." & TBox_SelVarPh.Text.Substring(1)) & vbCrLf 
        Summary &= SelVarTxt 
       End If 
      End If 
     Next 
     Summary &= String.Format("{0," & C1Wdt.ToString & "} {1," & C2Wdt.ToString & "}", "", New String(CChar("_"), C2Wdt)) & vbCrLf 
     Summary &= String.Format("{0," & C1Wdt.ToString & "} {1," & C2Wdt.ToString & "}", 
           "...Here Some text...", 
           Me.TBox_TotPhases.Text) & vbCrLf 
     If Me.TBox_PrtAdg.Text <> "€ 0,00" Then 
      Summary &= String.Format("{0," & C1Wdt.ToString & "} {1," & C2Wdt.ToString & "}", 
           "...Here Some text...", 
           Me.TBox_PrtAdg.Text) & vbCrLf 
      Summary &= "...Here Some text..." & TBox_PrtRapp.Text & "...Here Some text..." & TBox_CPrt.Text & "...Here Some text..." & vbCrLf 
     End If 
     Summary &= String.Format("{0," & C1Wdt.ToString & "} {1," & C2Wdt.ToString & "}", 
           "...Here Some text..." & TBox_ForfPercent.Text, 
           Me.TBox_ForfImp.Text) & vbCrLf 
     Summary &= "...Here Some text..." & TBox_TotPhases.Text & ")" & vbCrLf 
     Summary &= String.Format("{0," & C1Wdt.ToString & "} {1," & C2Wdt.ToString & "}", "", New String(CChar("_"), C2Wdt)) & vbCrLf 
     Summary &= String.Format("{0," & C1Wdt.ToString & "} {1," & C2Wdt.ToString & "}", 
           "...Here Some text...", 
           Me.TBox_TotAll.Text) & vbCrLf 
     Me.Hide() 
     Me.ShowInTaskbar = False 
     Frm_Summary.Show() 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
End Sub 

ここでは、[戻る]ボタンのコード:

Private Sub Btn_CloseNBack_Click(sender As Object, e As EventArgs) Handles Btn_CloseNBack.Click 
    Frm_Base.ShowInTaskbar = True 
    Frm_Base.Show() 
    Me.Close() 
End Sub 

私はコード間の任意のconnetionが表示されていない(それは見ます私は間違っています)私が逃しているものを私に見せてください。

+0

'Btn_CloseNBack_Click()'の中にブレークポイントを入れてデバッグしてみましたか? – Supersnake

+0

@Supersnake私は試しました。最初のコードは、すべて2番目のコードを実行した場合にのみ機能します – genespos

+0

問題の多くは、デフォルトのフォームインスタンスを使用し、 'ShowInTaskbar'をトグルすることに関連しています。ダイナミックコントロールを作成するには、コストがかかり、完了したらそれを処分する責任があります。 Visibleプロパティを切り替えるよりもはるかに「奇妙」です。 – Plutonix

答えて

1

あなたの問題に対して別の方法を提案してもよいですか? もし私があなただったら、描画されたdatagridviewを使用することを考えていました。 次に、表示/非表示ボタンで、フォームのサイズを再計算するとともに、そのデータグリッドビューの表示を切り替えます。通貨列については

、代わりに別のテーブルを作ることを、あなたは自分のDataGridViewにデータテーブルを読み込むことができ、その後、通貨にその列の書式を設定します。

DGV_Tbl.Columns("CurrencyColumn").DefaultCellStyle.Format = "c" 
DataGridViewの列の書式について

詳しい情報ことができます見つけられるhere

+0

何が起こったのか分かりませんが、DataTableから別のDataTableにデータをコピーするコードが削除され、DGV_Tbl.Datasourceがすべて変更されました。ありがとう! +1のセル形式 – genespos

+0

これは 'DGV_Tbl.Visible = False'と' DGV_Tbl.Visible = True'のために働きました。私はアプローチを変更することができますが、私のコードでバグを見つけたいのですが – genespos

+0

ボタンをクリックすると、datagridviewは表示されませんが、期待通りにフォームのサイズが変更されますか? "if"の場合(データグリービューが存在すると予想される場所)とそうでないと予想される場合の両方で、2つの行にブレークラインを追加したいとします。対応するifがあなたの考え方と呼ばれるかどうかを確認します。 – HaPhan

関連する問題