2

私はこれが何百万回も尋ねられたことを知っています.4〜5の異なる解決策を試しましたが、どれも結果をもたらさないようです.

「QoE」というタイトルのメイン フォームがあり、「Utils」と「Tests」というタイトルの 2 つのクラスがあります。

テストは、Utils.ProgressBar() を使用して Utils からパブリック共有サブを呼び出します

Utils.ProgressBar() は、QoE というタイトルのメイン フォームからプログレス バー コントロールを更新します。

ProgressBar 修飾子オプションは Public に設定されていますが、Utils から直接コントロールにアクセスすることはできません (以前はできると思っていました)。オプション 2 は、Utils クラスでこれを使用しようとすることでした。

Dim f1 as New QoE()
f1.ProgressBarMain.Increment(+1)
f1.ProgressPercent.Text = f1.ProgressBarMain.Value.ToString() & "%"

しかし、それは何も生み出しません。

オプション 3-5 は、パブリック静的クラスであるモジュールを作成し、メイン フォーム自体にパブリック共有更新サブを配置しようとしていました。これらのオプションを使用すると、通常、「共有メソッド内からクラスのインスタンスメンバーを参照できません」というエラーが発生します。

それで、私は何が欠けていますか?助けていただければ幸いです。みんなありがとう。


編集


あなたは本当にここで髪を分割しているだけです。これはコードがなくても完全に有効な質問ですが、コードは次のとおりです。

Public Class QoE
End Class

Public Class Utils
    public shared sub ProgressBar
        Dim f1 as New QoE()
        f1.ProgressBarMain.Increment(+1)
        f1.ProgressPercent.Text = f1.ProgressBarMain.Value.ToString() & "%"
        'QoE.ProgressBarMain.Increment(+1) Returns The error mentioned in the comments
    end sub 
End Class

Public Class Tests
    public shared sub DoWork
        Utils.Progressbar()
    End Sub 

では、すべてがパブリックに設定されている場合、QoE フォームからコントロールにアクセスできないのはなぜですか? クラス終了

4

2 に答える 2

0

別の解決策は、開いているフォームをループすることです。

For Each FORM_ITEM As Form In Application.OpenForms
  If FORM_ITEM.Name = "Form1" Then
    With CType(FORM_ITEM, Form1)

      'Enter your code here

    End with
  End if
Next

ただし、これは開いているすべての「Form1」に適用されます。したがって、複数の「Form1」を使用する予定がある場合は、Nefariis が回答で示したように、Form_Load に識別子を設定できます。

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
   F = Me
End Sub

そして、その変数をループで使用します。

于 2016-11-27T23:49:45.213 に答える