我的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);
}
}
}
嗯......我可以说这是一个非常糟糕的方式......但是直到我找到一个真正的解决方案,只要它工作我很高兴。谢谢你的帮助!
答案 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));
希望对你有所帮助。