2016-08-30 24 views
1

Ich habe ein einfaches Formular mit einem Textfeld, einer Befehlsschaltfläche und ein paar Timern. Der einzige Zweck des Formulars besteht darin, dem Benutzer mitzuteilen, was gerade geschieht. Das Programm führt den gesamten Code wie erforderlich aus AUSSER für das Textfeld Änderungen. Ich weiß, dass der Code zum Implementieren der Textboxänderungen ausgeführt wird, da sich das Formular und die Eigenschaften der Befehlsschaltfläche nach Bedarf ändern.C# Textfeldeigenschaften werden nicht aktualisiert

Ich habe this.refresh und this.textbox1.refresh vergeblich hinzugefügt.

Ich bin neu in C# und die meiste Zeit habe ich keine Visual Studios zur Verfügung, so dass Ihre Hilfe am meisten geschätzt würde. Ich habe andere Beiträge zu diesem Thema gelesen und wahrscheinlich wurde die Antwort bereits gegeben, aber ich habe die Lösung nicht verstanden.

Der vereinfachte Code ist unten angegeben:

//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

Benötigen Sie wirklich zu rufen 'InitializeComponent()' auf jedem Timer-Tick? Ist Ihnen bewusst, dass dadurch alle Ihre Eigenschaften zurückgesetzt werden? – DavidG

+0

Wenn ich Ihr Problem richtig verstanden habe, wird der Text in Ihrem Textfeld nicht durch diesen Code aktualisiert 'this.textBox1.Text =" Nachricht speichern "+ sCorNo +". ";' Wenn das ticker-Ereignis von timer2 ausgelöst wird. Ist es? – RBT

Antwort

0

Wie @DavidG wies darauf hin, sollten Sie InitializeComponent() regelmäßig nicht anrufen oder sogar mehr als einmal, tun es als das erste, was in den Konstruktor.

Dies liegt daran, dass alle Steuerelemente und Eigenschaften, die Sie vom Designer hinzufügen/festlegen, in dieser Methode erstellt und initialisiert werden.

Eine andere Sache, darauf zu hinweisen, ist Timer.Enabled = true und Timer.Start() tun, um effektiv die gleiche Sache

Von: System.Windows.Forms.Timer.Enabled

die Methode lostelefonieren ist die gleiche wie auf true Aktiviert Einstellung. Ebenso ist das Aufrufen der Stop-Methode dasselbe wie das Setzen von Enabled auf false.

+0

Die InitializeComponent() wurde aus "public void PostCode()" entfernt. Das Problem wurde behoben. Danke vielmals. – Ben

0

Beide Timer nämlich timer1 und timer2 Feuer asynchron und laufen auf getrennten Fäden, die völlig unabhängig voneinander sind. Auch wenn die timer2 tick Ereignis wäre Setzen/Auffrischen der Text entsprechend durch folgenden Code:

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

Sie nie mit Garantie sagen kann, dass es nur passieren wird nach timer1 Zecke Ereignis die Ausführung seiner Callback-Methode abgeschlossen hat. In allen Wahrscheinlichkeiten setzt Ihr oben genannter Code die Texteigenschaft einer dangling text box instance, da Ihre InitializeComponent-Funktion (die aus dem Tick-Ereignis von timer1 aufgerufen wird) eine neue Instanz aller Formularsteuerelemente neu installieren muss.

Ihr Anruf zu InitializeComponent Funktion in PostCode Methode, die von Zecken Fall timer1 Zecke Ereignisse aufgerufen wird, ist nicht richtig, da es alle Instanzen von Formular-Steuerelemente auf neue setzt. Es sollte nur einmal im Konstruktor des Formulars aufgerufen werden. Entfernen Sie einfach diesen Code und Sie sollten gut sein. Ihre PostCode Funktion sollte eigentlich so aussehen, nachdem Sie dieses Stück Code loszuwerden:

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 
      } 
Verwandte Themen