1

他のクラスで何かをしている間にテキストボックスを更新したい。私のコードを入れてみましょう:

Form1.cs

namespace TestApp
{
    public partial class Form1 : Form
    {
        CalledClass call = new CalledClass();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            call.Call_UpdateBox();
        }

        public void UpdateBox()
        {
            textBox1.Text = "hello";
        }
    }
}

CalledClass.cs

namespace TestApp
{
    class CalledClass
    {
     public void Call_UpdateBox()
        {
            Form1 mainform = new Form1();

            //do looping for doing some tasks here and update textbox every time
            mainform.UpdateBox();
        }
    }
}

CalledClass の Call_UpdateBox 関数は、メイン フォームのボタンがクリックされたときに呼び出されます。そこでは、いくつかのループを実行し、その間にメイン フォームのテキスト ボックスを更新する必要があります。デバッグモードで値が表示されるとテキストボックスが更新されますが、メインフォームでは空白になります。提案してください。事前にt​​hx。

4

4 に答える 4

5

Form1既に存在するものを参照するのではなく、 の新しいインスタンスを宣言しています。あなたがすべき:

namespace TestApp
{
    public partial class Form1 : Form
    {
        CalledClass call = new CalledClass();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            call.Call_UpdateBox(this);
        }

        public void UpdateBox()
        {
            textBox1.Text = "hello";
        }
    }
}
namespace TestApp
{
    class CalledClass
    {
     public void Call_UpdateBox(Form1 Sender)
        {
            //do looping for doing some tasks here and update textbox every time
            sender.UpdateBox();
        }
    }
}
于 2013-06-13T16:35:53.283 に答える
2

新しいフォーム インスタンスを作成していますが、表示すらしていません。したがってUpdateBox()、適切なオブジェクト インスタンスを呼び出しているわけではありません。

代わりに、現在のmainForm. 例えば:

public void Call_UpdateBox(Form1 targetForm)
{
    targetForm.UpdateBox();
}

private void button1_Click(object sender, EventArgs e)
{
    call.Call_UpdateBox(this);
}
于 2013-06-13T16:36:03.573 に答える
1

あなたはThreadsWindowsForms にいるので、BackgroundWorkerを使用するので、より簡単な方法を使用できます。

Form1 は次のようになります。

public partial class Form1 : Form
{
    BackgroundWorker _bw = new BackgroundWorker();
    CalledClass call = new CalledClass();

    public Form1()
    {
        InitializeComponent();

        bw.DoWork += bw_DoWork;
        bw_ProgressChanged += bw_ProgressChanged;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (bw.IsBusy != true)
        {
            bw.RunWorkerAsync();
        }
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        call.Call_UpdateBox();
    }

    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        textBox1.Text = "hello";

        // Here you can access some progress property from CalledClass in order to monitor and inform progress
    }
}
于 2013-06-13T16:37:20.160 に答える