c# tutorial Wie zeige ich ein "Laden... Bitte warten "Nachricht in WinForms für ein langes Ladeformular?




c# winform mono (8)

Eine weitere Möglichkeit, den "Ladebildschirm" nur zu bestimmten Zeiten anzuzeigen, besteht darin, ihn vor das Ereignis zu setzen und nach Beendigung des Ereignisses zu verwerfen.

Beispiel: Sie möchten ein Ladeformular für ein Ereignis anzeigen, bei dem das Ergebnis als MS-Excel-Datei gespeichert und nach der Verarbeitung gelöscht wird. Gehen Sie dazu wie folgt vor:

LoadingWindow loadingWindow = new LoadingWindow();

try
{
    loadingWindow.Show();                
    this.exportToExcelfile();
    loadingWindow.Close();
}
catch (Exception ex)
{
    MessageBox.Show("Exception EXPORT: " + ex.Message);
}

Oder du kannst loadingWindow.Close() innen finally blockieren lassen.

Ich habe ein Formular, das sehr langsam ist, da viele Steuerelemente auf dem Formular platziert sind.

Daher dauert das Laden des Formulars sehr lange.

Wie lade ich zuerst das Formular, dann zeige es an und lade während der Ladeverzögerung ein anderes Formular mit der Nachricht "Loading ... please wait.?"


Sie möchten in 'Splash'-Bildschirme schauen.

Zeigen Sie ein weiteres "Splash" -Formular an und warten Sie, bis die Verarbeitung abgeschlossen ist.

Hier ist eine kurze und schmutzige post darüber, wie es geht.

Hier ist ein besseres example .


Der beste Ansatz, wenn Sie auch ein animiertes Bild haben, ist dieses:

1- Sie müssen ein "WaitForm" erstellen, das die Methode empfängt, die im Hintergrund ausgeführt wird. Wie dieser

public partial class WaitForm : Form
{
    private readonly MethodInvoker method;

    public WaitForm(MethodInvoker action)
    {
        InitializeComponent();
        method = action;
    }

    private void WaitForm_Load(object sender, EventArgs e)
    {
        new Thread(() =>
        {
            method.Invoke();
            InvokeAction(this, Dispose);
        }).Start();
    }

    public static void InvokeAction(Control control, MethodInvoker action)
    {
        if (control.InvokeRequired)
        {
            control.BeginInvoke(action);
        }
        else
        {
            action();
        }
    }
}

2 - Sie können die Waitform wie folgt verwenden

private void btnShowWait_Click(object sender, EventArgs e)
{
    new WaitForm(() => /*Simulate long task*/ Thread.Sleep(2000)).ShowDialog();
}


Sie sollten einen Hintergrund-Thread erstellen, um das Formular zu erstellen und zu füllen. Dadurch kann Ihr Vordergrund-Thread die Lade-Nachricht anzeigen.


Eine einfache Lösung:

using (Form2 f2 = new Form2())
{
    f2.Show();
    f2.Update();

    System.Threading.Thread.Sleep(2500);
}

Und dann ersetzen Sie Ihr Laden für den Schlaf.


Ich habe ein animiertes Gif in eine Form namens FormWait und dann habe ich es so genannt:

// show the form
new Thread(() => new FormWait().ShowDialog()).Start();

// do the heavy stuff here

// get the form reference back and close it
FormWait f = new FormWait();
f = (FormWait)Application.OpenForms["FormWait"];
f.Close();

Ich habe mir die Lösungen am besten angesehen, bin aber auf eine andere, die ich bevorzuge, gestoßen. Es ist einfach, verwendet keine Threads und funktioniert so, wie ich es möchte.

http://weblogs.asp.net/kennykerr/archive/2004/11/26/where-is-form-s-loaded-event.aspx

Ich habe die Lösung in dem Artikel hinzugefügt und den Code in eine Basisklasse verschoben, von der alle meine Formulare übernommen werden. Jetzt rufe ich nur eine Funktion auf: ShowWaitForm () während des Ereignisses frm_load () eines Formulars, das während des Ladens des Formulars ein Wartedialogfeld benötigt. Hier ist der Code:

public class MyFormBase : System.Windows.Forms.Form
{
    private MyWaitForm _waitForm;

    protected void ShowWaitForm(string message)
    {
        // don't display more than one wait form at a time
        if (_waitForm != null && !_waitForm.IsDisposed) 
        {
            return;
        }

        _waitForm = new MyWaitForm();
        _waitForm.SetMessage(message); // "Loading data. Please wait..."
        _waitForm.TopMost = true;
        _waitForm.StartPosition = FormStartPosition.CenterScreen;
        _waitForm.Show();
        _waitForm.Refresh();

        // force the wait window to display for at least 700ms so it doesn't just flash on the screen
        System.Threading.Thread.Sleep(700);         
        Application.Idle += OnLoaded;
    }

    private void OnLoaded(object sender, EventArgs e)
    {
        Application.Idle -= OnLoaded;
        _waitForm.Close();
    }
}

MyWaitForm ist der Name eines Formulars, das Sie erstellen, um wie ein Wartedialog zu aussehen. Ich habe eine SetMessage () - Funktion hinzugefügt, um den Text auf dem Warteformular anzupassen.





winforms