1

たとえば、いくつかのコントロールを静的にする必要があります。

private static System.Windows.Forms.TextBox infoBox;
infoBox = new System.Windows.Forms.TextBox();

だから私は他のクラスでそれを使うことができます:

string myInfo = CourseWork.Form1.infoBox.Text;

しかし、ビジュアルデザイナーを使用すると、ビジュアルスタジオはコードを次のように変更します。

private System.Windows.Forms.TextBox infoBox; // it removes static
this.infoBox = new System.Windows.Forms.TextBox(); // and add .this

そして、次のエラーが発生しました:

    An object reference is required for the non-static field, 
method, or property 'CourseWork.Form1.infobox'

これを回避することは可能ですか?または多分私は何か間違ったことをしていますか?

4

3 に答える 3

2

デザインに欠陥があると思います。infoBoxはフォームに属しているため、フォーム外のオブジェクトがフォームにアクセスしようとしてはなりません。

GetText()デメテルの法則に違反することなく他のオブジェクトを可視化するには、フォームクラスにアクセサメソッドを追加する必要があるようです。

于 2012-10-15T20:34:58.887 に答える
0

いけない.....やる......それ!

メソッドを使用してコントロールを公開します。Invoke駆動型メソッドを使用してコントロールプロパティの変更を公開することもお勧めします。そうすれば、変更がクロススレッドと呼ばれる場合、適切に処理されます。

例:

public delegate void SetButtonTextDelegate(string text);
public void SetButtonText(String text)
{
     if(button.InvokeRequired)
     {
         Callback settext = new SetButtonTextDelegate(SetButtonText);
         button.Invoke(settext, text);
     }
     else
     {
         button.Text = text;
     }
}

次に、外部クラスで、SetButtonText( "new text");を呼び出すだけです。方法

于 2012-10-15T20:37:27.873 に答える
0

フォームのインスタンスが最大で1つあることが確実な場合は、テキストボックスのテキストを公開する静的プロパティを作成できます。これを行うには、フォーム自体への静的参照が必要です(私はフォームInfoFormを、よりも有益なものと呼んでいますForm1)。

この目的のために、静的Openメソッドを追加します。フォームがすでに開いている場合はフォアグラウンドになり、そうでない場合はフォームを開いて静的フィールドに割り当てます_instance

public partial class InfoForm : Form
{
    public InfoForm()
    {
        InitializeComponent();
    }

    private static InfoForm _instance;

    public static InfoForm Open()
    {
        if (_instance == null) {
            _instance = new InfoForm();
            _instance.Show();
        } else {
            _instance.BringToFront();
        }
        return _instance;
    }

    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);

        // Make sure _instance is null when form is closed
        _instance = null;
    }

    // Exposes the text of the infoBox
    public static string InfoText
    {
        get { return _instance == null ? null : _instance.infoBox.Text; }
        set { if (_instance != null) _instance.infoBox.Text = value; }
    }
}

infoText TextBoxこれで、フォームを開いて、このようにアクセスできます

InfoForm.Open();
InfoForm.InfoText = "Hello";
string msg = InfoForm.InfoText;
于 2012-10-15T21:01:27.437 に答える