当我使用不同的函数执行完全相同的操作时,为什么我的文本框不会更新?

时间:2009-02-04 15:40:28

标签: c# multithreading class delegates invoke

我的TextBox不会更新!我正在使用它作为日志来更新其他事情正在做什么...

表单1代码:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Data.OleDb;
using System.Collections.Specialized;
using System.Text;

delegate void logAdd(string message);

namespace LCR_ShepherdStaffupdater_1._0
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent(); 
        }

        public void logAdd(string message)
        {
            this.Log.Items.Add(message); // Doesnt add to textbox

            this.Log.Items.Add("This won't update the textbox!!! Why?"); // Doesnt add to textbox
        }

        private void exitProgramToolStripMenuItem_Click(object sender, EventArgs e) 
        {
            Application.Exit(); 
        }
        private void aboutToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form aboutBox = new AboutBox1(); 
            aboutBox.ShowDialog(); 
        }

        private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
        {
        }

        private void settingsToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            settingsForm.settings.ShowDialog();
        }

        private void synchronize_Click(object sender, EventArgs e)
        {
            this.Log.Items.Add("This WILL update the textbox. It is exactly the same as the other one..."); // This will add to the textbox
            DatabaseHandling.createDataSet();
        }

    }

    public class settingsForm 
    {
        public static Form settings = new Settings();
    }

}

我的记录类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LCR_ShepherdStaffupdater_1._0
{
    public class Logging
    {
        static Main mainClass = new Main();
        static logAdd logAddDelegate;

        public static void updateLog(string message)
        {
            logAddDelegate = mainClass.logAdd;
            logAddDelegate(message);
        }
    }
}

我只是完全难过....有没有人知道如何修复logAdd函数以便我可以让我的文本框日志最终更新?

修改

我终于得到了它的工作,这是修复:

Form1代码

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Data.OleDb;
using System.Collections.Specialized;
using System.Text;

delegate void logAdd(string message);

namespace LCR_ShepherdStaffupdater_1._0
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent(); 
        }

        public void add(string message)
        {
            this.Log.Items.Add(message);
        }
        public void logAdd(string message)
        {
            Log.Invoke(new logAdd(add), new object[] { message });
        }

        private void exitProgramToolStripMenuItem_Click(object sender, EventArgs e) 
        {
            Application.Exit(); 
        }
        private void aboutToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form aboutBox = new AboutBox1(); 
            aboutBox.ShowDialog(); 
        }

        private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
        {
        }

        private void settingsToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            settingsForm.settings.ShowDialog();
        }

        private void synchronize_Click(object sender, EventArgs e)
        {
            logAdd("this works");
        }

    }

    public class settingsForm 
    {
        public static Form settings = new Settings();
    }

}

记录代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LCR_ShepherdStaffupdater_1._0
{
    public class Logging
    {
        static Main mainClass = new Main();
        static logAdd logAddDelegate;

        public static void updateLog(string message)
        {
            logAddDelegate = mainClass.logAdd;
            logAddDelegate(message);
        }
    }
}

嗯......我可以说这是一个非常糟糕的方式......但是直到我找到一个真正的解决方案,只要它工作我很高兴。谢谢你的帮助!

4 个答案:

答案 0 :(得分:4)

从您发布的代码中,您的静态Logger类正在创建Main表单的新实例。这与您在UI上运行的不同。

总的来说,这不是一个非常好的设计模式。如果你想让我详细说明并提供样品,请写评论。

答案 1 :(得分:1)

您从哪个线程调用Logging.updateLog()?如果它不是UI线程,我可以看到TextBox在这种情况下不会更新。如果您尝试从logAdd()调用synchronize_Click()(假设这是基于名称从UI线程调用的),那么它是否有效?

答案 2 :(得分:1)

synchronize_click在正在运行的主窗体的实例上运行。 logadd函数在您在日志记录代码中创建的单独主窗体上运行。为此,您需要将现有的主表单传递给日志代码,以便更新您可以看到的文本框,而不是更新的文本框。

答案 3 :(得分:0)

之前我遇到过类似的问题,写完之后通过在文本框中调用.Invalidate()来解决问题。

您还可以通过以下方式检查您的邮件是否真正进入文本框:

debug.WriteLine( this.Log.Items( this.Log.Items.Count-1));

希望对你有所帮助。