Почему мое текстовое поле не обновляется, когда я делаю то же самое с другой функцией? - PullRequest
0 голосов
/ 04 февраля 2009

Мой 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, чтобы я мог наконец-то обновить свой журнал текстового поля?

EDIT:

Я наконец-то заставил его работать, вот исправление:

Код 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 голосов
/ 04 февраля 2009

Из кода, который вы разместили, ваш статический класс Logger создает новый экземпляр формы Main. который отличается от того, который вы используете в пользовательском интерфейсе.

В целом, это не очень хороший шаблон дизайна. напишите комментарий, если вы хотите, чтобы я уточнил и дал образец.

1 голос
/ 04 февраля 2009

synchronize_click запускается на экземпляре основной формы, которая работает. Функция logadd запускается в отдельной главной форме, которую вы создаете в коде регистрации. Чтобы это работало, вам нужно передать существующую основную форму в код журнала, чтобы она обновляла текстовое поле, которое вы видите, а не дополнительное текстовое поле, которое вы не делаете.

1 голос
/ 04 февраля 2009

Из какой темы вы звоните Logging.updateLog() с? Если это не поток пользовательского интерфейса, я мог бы видеть, что TextBox не будет обновляться в этом случае. Если вы попытаетесь вызвать logAdd() из synchronize_Click() (при условии, что это вызывается из потока пользовательского интерфейса, основанного на имени), это будет работать тогда?

0 голосов
/ 04 февраля 2009

Однажды у меня была похожая проблема, она была решена путем вызова .Invalidate() в текстовом поле после записи в него.

Вы также можете проверить, действительно ли ваше сообщение попадает в текстовое поле с помощью:

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

Надеюсь, это поможет вам.

...