C#文本框属性不会更新

时间:2016-08-30 02:16:39

标签: c# winforms properties textbox

我有一个带有文本框,命令按钮和几个计时器的简单表单。表单的唯一目的是告知用户发生了什么。程序会根据需要执行所有代码 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();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

正如@DavidG指出的那样,你不应该定期调用InitializeComponent(),甚至不要再调用一次,作为构造函数中的第一件事。

这是因为您在设计器中添加/设置的任何控件和属性都是在此方法中创建和初始化的。

要指出的另一件事是Timer.Enabled = trueTimer.Start()有效地做同样的事情

来自:System.Windows.Forms.Timer.Enabled

  

调用Start方法与将Enabled设置为true相同。同样,调用Stop方法与将Enabled设置为false相同。

答案 1 :(得分:0)

两个定时器即timer1timer2异步触发,并在完全独立的线程上运行。即使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
          }