2016-08-30 15 views
1

私はテキストボックス、コマンドボタンといくつかのタイマーを持つ単純なフォームを持っています。フォームの唯一の目的は、何が起こっているのかをユーザーに知らせることです。プログラムは、必要に応じてすべてのコードを実行しますテキストボックスの変更を除いて。私はフォームとコマンドボタンのプロパティが必要に応じて変更されるため、テキストボックスの変更を実装するコードが実行されることがわかります。C#テキストボックスのプロパティが更新されません

this.refreshとthis.textbox1.refreshを無駄に追加しました。

私はC#の初心者です。ほとんどの場合、私はVisual Studiosを利用できませんので、あなたの支援が最も高く評価されます。私はこのトピックに関する他の記事を読んできましたが、おそらく答えはすでに与えられていますが、私は解決策を理解していません。 、@DavidGが指摘したように、あなたが定期的に、あるいは複数回、その後InitializeComponent()を呼び出すべきではありません

//PROGRAM.CS 

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web; 
using System.Windows.Forms; 
using WindowsFormsApplication1; 

namespace PostBinaryFile 
{ 
    static class Program 
    { 
     /// The main entry point for the application. 
     [STAThread] 
     static void Main(string[] args) 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1(args)); 
      } 
    } 
} 

//FORM1.CS 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO; 
using System.Web; 
using System.Net; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     string sUrl; 
     string sFileName; 
     string sCorNo; 
     public Form1(string[] args) 
     { 
      sUrl = args[0]; 
      sFileName = args[1]; 
      sCorNo = args[2]; 
      InitializeComponent(); 
      timer1.Enabled = true; 
      timer1.Start(); 
      timer2.Enabled = true; 
      timer2.Start(); 
     } 
     public void PostCode() 
     { 
      InitializeComponent(); 
      string sToken; 
      string sPath; 
      const string boundary = "----WebKitFormBoundaryePkpFF7tjBAqx29L"; 
      try 
      { 
//Do all general code work here. 
//Alter form to show successful post to web 
       this.button1.Visible = true; 
       this.button1.Enabled = true; 
       this.BackColor = System.Drawing.Color.FromArgb(189,194,241); 
       this.textBox1.Text = sCorNo + " Outlook file saved to FuseDMS."; // this code is executed but is not reflected on the Form 
       this.textBox1.BackColor= System.Drawing.Color.FromArgb(189,194,241); // this code is executed but is not reflected on the Form 
      } 
     private void timer1_Tick(object sender, EventArgs e) 
     { 
      timer1.Stop(); 
      timer1.Enabled = false; 
      PostCode(); 
     } 
     private void timer2_Tick(object sender, EventArgs e) 
     { 
      timer2.Stop(); 
      timer2.Enabled = false; 
      this.textBox1.Text = "Saving Message " + sCorNo + "."; 
     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      Application.Exit(); 
     } 
    } 
} 
+4

は、あなたが本当に 'のInitializeComponent()'すべてのタイマーチックに呼び出しする必要があります:あなたは、コードのその部分を取り除くの後にあなたのPostCode機能は、実際には、次のようになりますか?これがあなたのすべてのプロパティをリセットすることに気づいていますか? – DavidG

+0

問題を正しく解決した場合、テキストボックス内のテキストは、このコードを通して更新されません。 'this.textBox1.Text = "timer2のティックイベントが発生すると、メッセージ" + sCorNo + "。";それは...ですか? – RBT

答えて

0

コンストラクタの最初のものとしてそれを実行します。

単純化されたコードは以下のとおりです。

これは、デザイナーから追加または設定したコントロールおよびプロパティが、このメソッドで作成および初期化されるためです。指摘する

もう一つはTimer.Enabled = trueTimer.Start()あるから効果的に同じこと

を実行します。Startメソッドを呼び出すSystem.Windows.Forms.Timer.Enabled

真に有効に設定した場合と同じです。同様に、Stopメソッドを呼び出すことは、Enabledをfalseに設定することと同じです。

+0

"public void PostCode()"からInitializeComponent()を削除しました。問題を修正しました。どうもありがとう。 – Ben

0

timer1timer2の両方のタイマは非同期で起動し、互いに完全に独立した別々のスレッドで実行されます。タイマー2のTickイベントは、コードの下を通して適切にテキストを更新/設定されます場合でも:

this.textBox1.Text = "Saving Message " + sCorNo + "."; 

あなたはタイマ1のTickイベントは、そのコールバックメソッドの実行を完了した後にのみそれが起こるだろうという保証を持って言うことはできません。あなたの上記のコードでは、InitializeComponent関数(timer1のtickイベントから呼び出される)がすべてのフォームコントロールの新しいインスタンスを再インスタンス化する必要があるため、ダングリングテキストボックスインスタンスのテキストプロパティを設定しています。

PostCodeのtimer01のtickイベントのtickイベントから呼び出されたメソッドのInitializeComponentの呼び出しは、フォームコントロールのすべてのインスタンスを新しいものにリセットするので正しくありません。これは、フォームのコンストラクタで一度だけ呼び出される必要があります。そのコードを削除するだけで良いはずです。

public void PostCode() 
     { 
      string sToken; 
      string sPath; 
      const string boundary = "----WebKitFormBoundaryePkpFF7tjBAqx29L"; 
      try 
      { 
//Do all general code work here. 
//Alter form to show successful post to web 
       this.button1.Visible = true; 
       this.button1.Enabled = true; 
       this.BackColor = System.Drawing.Color.FromArgb(189,194,241); 
       this.textBox1.Text = sCorNo + " Outlook file saved to FuseDMS."; // this code is executed but is not reflected on the Form 
       this.textBox1.BackColor= System.Drawing.Color.FromArgb(189,194,241); // this code is executed but is not reflected on the Form 
      } 
関連する問題