C# jak zrobić komunikat "proszę czekać"


(Mpbaton) #1

Witam,

próbuję zrobić coś takiego że podczas wczytywania danych w głównym wątku wyświetla się okno "proszę czekać" dopóki wczytywanie się nie skończy. Szukałem różnych rozwiązań z wątkami ale nie wiem jak to zrobić:confused:

Na głównej formie mam datagrid z button. Po wciśnięciu buttona ładują się dane z bazy danych i w tym czasie chce wyświetlić to okienko i żeby się samo zamknęło gdy już wszystko się wczyta. Jak to zrobić na wątkach?

public partial class Main : Form

    {

        NpgsqlConnection conn = new NpgsqlConnection("server=127.0.0.1;Port=5432;User Id=dba; Password=; Database=postgres");

        public Main()

        {

            InitializeComponent();

        }


        private void button1_Click(object sender, EventArgs e)

        {

            NpgsqlCommand comm = new NpgsqlCommand("select * from dane", conn);

            NpgsqlDataAdapter da = new NpgsqlDataAdapter(comm);

            DataTable dt = new DataTable();

            da.Fill(dt);

            dgvTest.DataSource = dt;

            this.dgvTest.AlternatingRowsDefaultCellStyle.BackColor = Color.Lavender;

        }

}

(Djluki) #2

Poczytaj o BackgroundWorker.

Np tutaj: http://lukaszsowa.pl/2009/08/prosty-spo ... ndworkera/

W internecie jest dużo przykładów jego użycia.


(Mpbaton) #3

Zrobiłem tak:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.Data.SqlClient;

using Npgsql;

using System.Threading;


namespace linq

{

    public partial class Main : Form

    {

        private string lvLogin = "";

        private int lvUprawnienia;

        private string lvQuery = "select * from uzytkownik";

        private SqlInterface sql;


        public Main()

        {

            InitializeComponent();

        }


        private void button1_Click(object sender, EventArgs e)

        {

            backgroundWorker1.RunWorkerAsync();

        }


        public void Wyswietl()

        {

            sql = new SqlInterface();

            sql.Connect();

            sql.Bind_JOIN(lvQuery,dgvTest);

            this.dgvTest.AlternatingRowsDefaultCellStyle.BackColor = Color.Lavender;

        }

        private void Main_Load(object sender, EventArgs e)

        {

            if (Login.Equals(""))

            {

                logon lo = new logon();

                try

                {

                    lo.Login = "";

                    this.Enabled = false;

                    this.Visible = false;

                    lo.ShowDialog();

                    if (lo.Login.Equals(""))

                    {

                        Close();

                    }

                    Login = lo.Login;

                    Uprawnienia = lo.Uprawnienia;

                }

                finally

                {

                    this.Enabled = true;

                    this.Visible = true;

                    lo.Close();

                }

            }

        }


        public string Login

        {

            get { return lvLogin; }

            set { lvLogin = value; }

        }


        public int Uprawnienia

        {

            get { return lvUprawnienia; }

            set { lvUprawnienia = value; }

        }


        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

        {

            wait wt = new wait();

            wt.Show();

            Thread th = new Thread(new ThreadStart(this.Wyswietl));


            th.Start();

        }


        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

        {

            wait wt = new wait();

            wt.Close();

        }

    }

}

i mam błąd: "Nieprawidłowa operacja między wątkami: do formantu 'dgvTest' uzyskiwany jest dostęp z wątku innego niż wątek, w którym został utworzony." i nie wiem jak to poprawić, macie jakiś pomysł?


(system) #4

Problem już pewnie roziwązany, ale wystarczy w do_Work tylko to:

wait wt = new wait();

wt.Show();

this.Wyswietl();

a w RunWorkerCompleted niepotrzebnie tworzysz nową instancję okienka oczekiwania...