2017-01-22 4 views
0

私は自分のアプリケーションにアクティビティ・ロガーを追加しようとしています。私はコードをきれいに保つことを望んでいるので、現在のアクティビティを自分のコードに一度記述し、それをlblStatusに表示してログファイルを更新します。私はこのようにこれをやろうとしている:合格フォームのラベルにアクセスする

私は、通常のフォーム上でこのようにそれを渡している:

LogActivity.LogActivity(Me, "Checking program directories...") 

そして、これが作業をやっているサブです。

Public Sub LogActivity(FormID As Form, ByVal ActivityDescription As String) 

'Log Activity code is here 

'Update Status Label on form 
FormID.lblStatus = ActivityDescription 

end sub 

しかし、Visual Studioは構文を理解していませんが、その理由を理解できますが、これを正しく行う方法がわかりません。

「lblStatusは」「フォーム」しかし

のメンバーではない、すべての私のフォームは、このサブを呼ぶので、私は本当にサブと呼ばれ、フォーム理解し、更新する私のコードを必要としますそのフォームのlblを具体的に示します。

私はちょうどこのように、フォームの名前を確認することができます:

If Form.Name = "Main_Loader" Then 
Main_Loader.lblStatus = ActivityDescription 
elseif Form.Name = "..." then 
end if 

をしかし、再び、それは非常にきれいではないですし、適切な方法のように見えるしていません...誰もがアドバイスしてもらえますか?

+0

'システムを、Windows.Forms'はから基底クラスでありますすべてのフォームが継承します。これは 'MyForm'や' Form1'やフォームクラスの名前と同じではありません。とにかく、変数ではなくUI要素を渡すことでフォームをきれいに保つことを望みます。 – Plutonix

+0

ロガーを呼び出す前にラベルを更新しないでください**あなたは既に適切なスコープを持っています。ログファイルを更新するには、ログクラスを使用してください。それは、呼び出しフォームを把握し、あなたのロギングクラスの適切な型にFormId変数をキャストする必要からあなたを維持します –

答えて

1

ラベルはフォームのALLの「lblStatus」と呼ばれていると仮定すると、あなたは、単にこのようなControls.Find()使用できます。

Public Sub LogActivity(FormID As Form, ByVal ActivityDescription As String) 
    Dim matches() As Control = FormID.Controls.Find("lblStatus", True) 
    If matches.Length > 0 AndAlso TypeOf matches(0) Is Label Then 
     Dim lbl As Label = DirectCast(matches(0), Label) 
     lbl.Text = ActivityDescription 
    End If 
End Sub 
+0

絶対に、私はあなたに感謝しています。 – user3516240

1

カスタムイベントを使用できます。戻って報告された情報を必要とするフォームは、LogActivityを持つ形式のイベントをサブスクライブします。

Public Class frmActivity 'name of class is an example 
    Private log As New LogClass 
    Public Event LogActivity(ActivityDescription As String, log As LogClass) 
    'somewhere in code raise this event and send to info to main form 
    Private Sub SomeEventSub() 
    RaiseEvent LogActivity("some status", log) 
    End Sub 
    '... 
End Class 

Public Class frmMain 'name of class is an example 
    Private Sub btnGetActivity() Handles btnGetActivity.Click 
    Dim frm As New frmActivity 
    Addhandler frm.LogActivity, AddressOf LogActivity 
    frm.Show() 
    End SUb 
    Private Sub LogActivity(ActivityDescription As String, log As LogClass) 
    lblStatus = ActivityDescription 
    'then use the log variable to store the log data 
    End Sub 
    '... 
End Class 
関連する問題