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




c# winform mono (7)

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();
}

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.?"


Die Verwendung eines separaten Threads zur Anzeige einer einfachen Bitte-warten-Nachricht ist übertrieben, besonders wenn Sie nicht viel Erfahrung mit Threading haben.

Ein viel einfacherer Ansatz besteht darin, ein "Bitte warten" -Formular zu erstellen und es als ein modusloses Fenster unmittelbar vor dem langsamen Ladeformular anzuzeigen. Sobald das Hauptformular geladen ist, blende das bitte warten Formular aus.

Auf diese Weise verwenden Sie nur den einen Hauptthread der Benutzeroberfläche, um zuerst das Formular "Bitte warten" anzuzeigen und dann das Hauptformular zu laden.

Die einzige Einschränkung dieses Ansatzes besteht darin, dass das Formular "Bitte warten" nicht animiert werden kann (z. B. ein animiertes GIF), da der Thread gerade mit dem Laden des Hauptformulars beschäftigt ist.

PleaseWaitForm pleaseWait=new PleaseWaitForm ();

// Display form modelessly
pleaseWait.Show();

//  ALlow main UI thread to properly display please wait form.
Application.DoEvents();

// Show or load the main form.
mainForm.ShowDialog();

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 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();

Nun, ich mache es so.

//For static wait dialog

DataTable SLTable = new DataTable();
_frmWaitDialog = new NormalWaitDialog();
_frmWaitDialog.Shown += async (s, e) =>
{
   Refresh();
   await Task.Run(() =>
   {
      //Do your stuff
   });
_frmWaitDialog.Close();
};
_frmWaitDialog.ShowDialog(this);



//For animated wait dialog

DataTable SLTable = new DataTable();
_frmWaitDialog = new NormalWaitDialog();
_frmWaitDialog.Shown += async (s, e) =>
{
   //create a async method and call the method here
   LoadDataAsync();
};
_frmWaitDialog.ShowDialog(this);

 private async void LoadDataAsync(){
       await Task.Run(() =>
       {
          //Do your stuff
       });
       _frmWaitDialog.Close();
 }


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





winforms