0

別のクラスファイル(chartscopier.csなど)からForm1要素にアクセスしたいのですが、chartscopier.csからtextbox1テキストを変更できません。

これどうやってするの?

これが私のコードです:

Form1.cs

namespace TEST
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var CopyCharts = new System.Threading.Timer(chartscopier.CopyGraph, null, 0, 60000);
        }
    }
}

chartscopier.cs

namespace TEST
{
    class chartscopier
    {
        //var Timer = new Timer(CopyGraph, null, 0, 60000);
        public static void CopyGraph(object data)
        {
            Stopwatch strTimer = new Stopwatch();
            WebClient WC = new WebClient();
            IConfigSource BaseConfig = new IniConfigSource(@"D:\NEWROBOT\CONFIG.ini");
            string LogDir = BaseConfig.Configs["GENERAL"].Get("Log Dir");
            string ImgDir = BaseConfig.Configs["GENERAL"].Get("IMG Dir");
            string[] Clients = BaseConfig.Configs["CLIENTS"].GetKeys();
            foreach (string Client in Clients)
            {
                strTimer.Start();
                //Console.WriteLine(Client);
                IConfigSource ClientConfig = new IniConfigSource(@"D:\NEWROBOT\" + Client + ".ini");
                string[] Services = ClientConfig.Configs["SERVICES"].GetKeys();
                foreach (string Service in Services)
                {
                    string url = BaseConfig.Configs["CLIENTS"].Get(Client);
                    string param = ClientConfig.Configs["SERVICES"].Get(Service);
                    string html = WC.DownloadString(url + param);

                    // Cargar doc en HPACK
                    HtmlDocument doc = new HtmlDocument();
                    doc.LoadHtml(html);

                    // LINQ para generar imagenes
                    var img = doc.DocumentNode.SelectSingleNode("//img[1]");
                    var src = img.Attributes["src"].Value;
                    string uIMG = url + src;
                    WC.DownloadFile(uIMG, @ImgDir + Client + "\\" + Service + ".png");
                }
                strTimer.Stop();
                TimeSpan ts = strTimer.Elapsed;
                string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
                strTimer.Reset();
                // WANT TO WRITE HERE Form1.TextBox1.text = "RunTime " + elapsedTime;
            }
        }
    }
}
4

4 に答える 4

2

より良い方法は、イベントを処理することだと思います。

渡すデータを表すクラスを作成します。

public class ChartCopyProgressEventArgs : EventArgs
{
  public TimeSpan ElapsedTime { get; set; }
  //you can add more prop.s here
}

「chartscopier」で、進捗状況を報告するイベントを作成します。

class chartscopier
{
 public static event EventHandler<ChartCopyProgressEventArgs> Changed;
 public static void CopyGraph(object data)
 {
 ...
 if (Changed != null)
 {
   var args = new ChartCopyProgressEventArgs();
   args.ElapsedTime = elapsedTime;
   Changed(null, args);
 }
 }
}

次に、Form1で、そのイベントのハンドラーを作成します。

public Form1()
{
 InitializeComponent();
 chartscopier.Changed += UpdateStatus;
 ...
}

private void UpdateStatus(object sender, ChartCopyProgressEventArgs e)
{ 
    var ts = e.ElapsedTime;
    var elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
    var str = "RunTime " + elapsedTime;

    if (TextBox1.InvokeRequired) {
        TextBox1.Invoke(() => {TextBox1.text = str;});
    } else {
         TextBox1.text = str;
    }
}
于 2012-09-14T17:19:44.830 に答える
0

フォームにアクセスできるようにフォームをその関数に渡してから、フォームにパブリック関数を記述してテキストボックスを変更/取得する必要があります。2つの関数がinvokeが必要かどうかをチェックしていることを確認してください。

于 2012-09-14T16:59:28.717 に答える
0

chartscopier.CopyGraphスコープ内に収まるように、操作する参照をメソッドに直接渡す必要があります。あなたのCopyGraph(object data)署名はもっと似ているべきですCopyGraph(object data, TextBox aTextBox)

次に、Form1のインスタンスから次のように呼び出すことができます。

chartscopier.CopyGraph(data,this.textBox1)
于 2012-09-14T17:00:09.210 に答える
0

この例では、他のクラスのフォーム要素にアクセスする方法を示します。

public partial class Form1 : Form
    {       
        private void button1_Click(object sender, EventArgs e)
        {
            FormCopier fc = new FormCopier();
            fc.PopulateTest(this.textBox1);
        }
    }  

そして他のクラスでは..

class FormCopier
{
    public void PopulateTest(TextBox t)
    {
        t.Text = "Demo";
        t.Refresh();
    }
}
于 2012-09-14T17:05:23.250 に答える