2

multiline に投稿する必要がありTextBoxます。データは、別のクラスの別のメソッドから取得されています。

class converter
{
    public static void convert(object source, FileSystemEventArgs f)
    {
        //... some job done now post this data to winforms
        Form1.textBox1 = "File Copied" + "  " + 
                         DateTime.Now.ToString("HH:mm:ss tt") +
                         Environment.NewLine;
    }
}

textBox1このクラスからはアクセスできません。それは言います:

Form1.textBox1' は保護レベル
のためアクセスできません 非静的フィールド、メソッド、またはプロパティ Form1.textBox1' にはオブジェクト参照が必要です

4

8 に答える 8

1

Form1Form1インスタンス変数の名前ではなく、おそらくフォームのタイプの名前です。おそらく Form1 のインスタンス メソッドの 1 つから呼び出されるためconvert、移動できます。

convert に依存関係を導入する代わりに、呼び出し元に

convert.convert(...);
textbox1 = "File Copied" + "  " + DateTime.Now.ToString("HH:mm:ss tt") +
           Environment.NewLine;
于 2013-05-24T08:06:00.343 に答える
1

TextBox をパブリックに変更し、Form1 のインスタンスを渡すことができますが、これらのアプローチはカプセル化の基本的なテナントに違反しており、クラス コンバーターは Form1 とそのコントロールについて何も認識してはなりません。

より良い方法は、クラス コンバーターが、呼び出し元が通知を希望する場合にクラスによって呼び出されるイベントを定義し、コンバーター クラスがジョブを完了した後に内部の何か (テキスト ボックス) を更新することです。

class converter
{
   public delegate void OnCopyComplete(string file);
   public event OnCopyComplete CopyComplete;
   public static void convert(object source, FileSystemEventArgs f)
   {
       //... some job done now NOTIFY the caller 
       if(CopyComplete != null) CopyComplete(source.ToString());
   }
}

そして Form1 インスタンスで

// tell to the converter class that this class wants to be notified when the work is finished
converter.CopyComplete += new converter.OnCopyComplete(UpdateMyLabels);
converter.convert(....);


public void UpdateMyLabels(string file)
{
    TextBox1.Text = "File Copied" + "  " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine;
}
于 2013-05-24T08:12:16.667 に答える
0

これを行う 1 つの方法は、フォームにフィールドを作成することです。

public static TextBox textBox;

それをform_loadのテキストボックスに設定します:

this.textBox = textBox1;

そして、上記のメソッドで、次のように呼び出します。

Form1.textBox.Text = ...

完全な作業例:

using System;
using System.Windows.Forms;

namespace StackOverflowWin
{
    public partial class Form1 : Form
    {
        public static TextBox textBox;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox = textBox1;

            TestClass.StaticMethod();
        }
    }

    public static class TestClass
    {
        public static void StaticMethod()
        {
            Form1.textBox.Text = "works";
        }
    }
}
于 2013-05-24T08:03:59.017 に答える
0

プロパティを設定: Modifier = Public

于 2013-05-24T08:08:31.680 に答える
0

次のような静的メソッドのパラメーターとしてフォームを含めないでください。

class converter
{
 public static void convert(object source, FileSystemEventArgs f, Form frm)
{
//... some job done now post this data to winforms
frm.textbox1 = "File Copied" + "  " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine;
}

ただし、Texbox が Form1 で公開されていることを確認してください。

        public static TextBox textBox1;

編集

したがって、パブリック Textbox が必要ない場合は、Form1 でパブリックおよび静的プロパティを作成し、次のようなフォームを渡す前に、そこにテキスト ボックスの値を渡す必要があります。

 public static String fromTextBox { get; set; }

次に、さらに Form1 で、テキストボックスの値を fromTextBox プロパティに保存します。

 fromTextBox = textBox1.Text;

したがって、次のようにアクセスできます。

 class converter
 {
  public static void convert(object source, FileSystemEventArgs f, Form frm)
  {
//... some job done now post this data to winforms
 frm.fromTextBox = "File Copied" + "  " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine;
 }
于 2013-05-24T08:15:00.133 に答える
0

実際には、フォームの既存のインスタンスを使用する必要があります。

var form = Form.ActiveForm as Form1;

if (form != null)
{
     form.textBox1.Text = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine";
}

実際には、より適切な設計であるイベントを使用する必要がありますが、上記は機能するはずです。

于 2013-05-24T08:05:14.857 に答える
0

このようなものが必要になります:

Form1.Invoke(new Action(delegate(){ textBox1.Text = "MyText"}));

コードが正しくない場合は申し訳ありませんが、Google を使い始めるには十分に近いものです。

上記が機能しない場合、これは次の可能性があります。

Form1.textBox1.Text.Invoke(new Action(delegate(){textBox1.Text="MyText"}));

それがどのように行われたか正確には覚えていません。

多分これ:

Invoke(new Action(() =>
{
    Form1.textBox1.Text = "MyString";
}));
于 2013-05-24T08:07:43.123 に答える