индикатор выполнения и загрузка данных - PullRequest
1 голос
/ 12 ноября 2011

У меня есть Windows Form в C # с Datagridview с большим номером. записей из базы данных и некоторых комбинированных списков, текстовых полей и кнопок.

Итак, я использовал другую форму с прогрессбаром и фоновым рабочим, чтобы загрузка данных из основной формы не раздражала конечного пользователя.

 public partial class FirstForm : Form
{
    MainForm mf;
    public FirstForm()
    {
        InitializeComponent();
      backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        mf = new MainForm(); //inside constructor,code of data loading in gridview
        mf.Update();
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        if (p1.Value < p1.Maximum)         //p1 name for progressbar
            p1.Value++;
        else
        {
            timer1.Enabled = false;
            this.Hide();
            mf.Show();
        }
    }

}

, но когда отображается основная форма, она пуста, и через 2/3 секунды отображается сетка данных и другие элементы управления.

как это решить ..?
или предложить другие идеи для решения этой проблемы.

1 Ответ

0 голосов
/ 12 ноября 2011

Удалите свой код в Firstform и напишите мой в programs.cs

static void Main()
{
    Application.EnableVisualStyles();
    Application.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

    Application.SetCompatibleTextRenderingDefault(false);

        System.ComponentModel.BackgroundWorker bw = new System.ComponentModel.BackgroundWorker();
        bw.DoWork += new System.ComponentModel.DoWorkEventHandler(bw_DoWork);
        bw.WorkerSupportsCancellation = true;
        MainForm = new MainForm(); // creating main form

bw.RunWorkerAsync (); frm.Inittiate (); // Добавить этот метод в первую форму для загрузки и инициализации

        bw.CancelAsync(); // ending splashing
        Application.Run(frm);
}     

static void bw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    AFirstForm splashForm = new FirstForm();
    splashForm.TopMost = true;
    splashForm.Show();
    while (!(sender as System.ComponentModel.BackgroundWorker).CancellationPending)
    {
        splashForm.Refresh();
    }
    splashForm.Close();    
    e.Result = splashForm;
}
...