我有一个带有文本框,命令按钮和几个计时器的简单表单。表单的唯一目的是告知用户发生了什么。程序会根据需要执行所有代码 EXCEPT以进行文本框更改。我知道执行文本框更改的代码已执行,因为窗体和命令按钮属性会根据需要更改。
我添加了this.refresh和this.textbox1.refresh无济于事。
我是C#的新手,大部分时间我都没有Visual Studios,所以非常感谢您的帮助。我已经阅读了关于这个主题的其他帖子,可能已经给出了答案,但我还没有理解解决方案。
简化代码如下:
//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();
}
}
}
答案 0 :(得分:0)
正如@DavidG指出的那样,你不应该定期调用InitializeComponent()
,甚至不要再调用一次,作为构造函数中的第一件事。
这是因为您在设计器中添加/设置的任何控件和属性都是在此方法中创建和初始化的。
要指出的另一件事是Timer.Enabled = true
和Timer.Start()
有效地做同样的事情
来自:System.Windows.Forms.Timer.Enabled
调用Start方法与将Enabled设置为true相同。同样,调用Stop方法与将Enabled设置为false相同。
答案 1 :(得分:0)
两个定时器即timer1
和timer2
异步触发,并在完全独立的线程上运行。即使timer2的tick事件将通过以下代码正确设置/刷新文本:
this.textBox1.Text = "Saving Message " + sCorNo + ".";
你永远不能保证只有在timer1的tick事件完成其回调方法的执行后才会发生。在所有可能的情况下,您的上述代码设置悬空文本框实例的text属性,因为您的InitializeComponent
函数(从timer1的tick事件调用)必须重新实例化所有表单控件的新实例。
您在InitializeComponent
方法中对PostCode
函数的调用是从timer1的tick事件的tick事件调用的,这是不对的,因为它将表单控件的所有实例重置为新的。它应该只在表单的构造函数中调用一次。只需删除那段代码就可以了。在你摆脱那段代码之后,你的PostCode
函数实际上应该是这样的:
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
}