0

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

4 に答える 4

4

投稿したコードから、静的 Logger クラスが Main フォームの新しいインスタンスを作成しています。これは、UI で実行しているものとは異なります。

全体として、これはあまり良い設計パターンではありません。詳しく説明してサンプルを提供してほしい場合は、コメントを書いてください。

于 2009-02-04T15:49:00.290 に答える
1

どのスレッドLogging.updateLog()から呼び出していますか? UI スレッドでない場合、TextBox が更新されないことがわかりました。logAdd()から呼び出してみるとsynchronize_Click()(これが名前に基づいて UI スレッドから呼び出されると仮定して)、機能しますか?

于 2009-02-04T15:47:42.507 に答える
0

以前に似たような問題がありましたが.Invalidate()、書き込み後にテキストボックスを呼び出すことで解決しました。

また、メッセージが実際にテキストボックスに到達していることを確認することもできます。

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

それがあなたを助けることを願っています。

于 2009-02-04T15:47:10.917 に答える