Długi czas wczytywania DataSet do DataGridView

2016-02-05 09:00

Rejestracja: 8 lat temu

Ostatnio: 14 godzin temu

0

Witam.

Mam taką metodę:

private void PresentData()
{
    log.stopwatch.Start();
    log.add("DataSet dataSet = null;");
    DataSet dataSet = null;

    log.add("dataSet = msSQL.pobierzListeDokumentow(dtpDateFrom.Value, dtpDateTo.Value);");
    dataSet = msSQL.pobierzListeDokumentow(dtpDateFrom.Value, dtpDateTo.Value);

    log.add(" dataGridView1.DataSource = dataSet.Tables[0];");
    dataGridView1.DataSource = dataSet.Tables[0];

    log.add("END");
} 

Klasa log:

public static class log
{
    public static Stopwatch stopwatch = new Stopwatch();
    public static List<String> events = new List<string>();

        public static void add(string x)
    {
            events.Add(log.stopwatch.Elapsed.ToString() + "\tStep " + x);
        }
}

Zapis w logu wygląda następująco:

00:00:00.0001324 Step DataSet dataSet = null
00:00:00.0001645 Step dataSet = msSQL.pobierzListeDokumentow(dtpDateFrom.Value, dtpDateTo.Value)
00:00:00.0177362 Step dataGridView1.DataSource = dataSet.Tables[0]
00:05:33.5494874 Step END

Jak widać czas wczytania DataSet do dataGridView1.DataSource zajmuje aż 5 minut przy czym zawartość `table[0]' to 21 kolumn na 1395 wierszy, więc niewiele.
Z czego może wynikać tak długi czas?

Sprawdzałem z VirtualMode ale to nic nie dało.

edytowany 1x, ostatnio: hipekk, 2016-02-05 09:00

Pozostało 580 znaków

2016-02-05 09:04

Rejestracja: 8 lat temu

Ostatnio: 11 godzin temu

0

a probowales zbindowac datagrida?

http://stackoverflow.com/ques[...]iew-with-large-amount-of-data
http://stackoverflow.com/ques[...]-datagridview-with-large-data

edytowany 1x, ostatnio: fasadin, 2016-02-05 09:04

Pozostało 580 znaków

2016-02-05 09:16

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

0

Spróbuj to:

dataGridView1.SuspendDrawing();
dataGridView1.DataSource = dataSet.Tables[0];
dataGridView1.ResumeDrawing();

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2016-02-05 09:16

Pozostało 580 znaków

2016-02-05 10:05

Rejestracja: 8 lat temu

Ostatnio: 14 godzin temu

0

@_13th_Dragon

Nie wiem czy tak powinno być , ale "mój" DataGridView nie posiada metod SuspendDrawing() i ResumeDrawing();.

Sugerując się wypowiedziami z linków @fasadin dodałem klasę:

public static class SuspendUpdate
    {
        private const int WM_SETREDRAW = 0x000B;

        public static void Suspend(Control control)
        {
            Message msgSuspendUpdate = Message.Create(control.Handle, WM_SETREDRAW, IntPtr.Zero,
                IntPtr.Zero);

            NativeWindow window = NativeWindow.FromHandle(control.Handle);
            window.DefWndProc(ref msgSuspendUpdate);
        }

        public static void Resume(Control control)
        {
            // Create a C "true" boolean as an IntPtr
            IntPtr wparam = new IntPtr(1);
            Message msgResumeUpdate = Message.Create(control.Handle, WM_SETREDRAW, wparam,
                IntPtr.Zero);

            NativeWindow window = NativeWindow.FromHandle(control.Handle);
            window.DefWndProc(ref msgResumeUpdate);

            control.Invalidate();
        }
    }

A kod metody zmieniłem na:

        private void PresentData()
        {
            SuspendUpdate.Suspend(dataGridView1);

            log.stopwatch.Start();
            log.add("DataSet dataSet = null;");
            DataSet dataSet = null;

            log.add("dataSet = msSQL.pobierzListeDokumentow(dtpDateFrom.Value, dtpDateTo.Value);");
            dataSet = msSQL.pobierzListeDokumentow(dtpDateFrom.Value, dtpDateTo.Value);

            log.add(" dataGridView1.DataSource = dataSet.Tables[0];");
            dataGridView1.DataSource = dataSet.Tables[0];
            SuspendUpdate.Resume(dataGridView1);
           log.add("END");
        }

Niestety nie przyniosło to rezultatu :/

chwila to jest wpf czy windows forms? - fasadin 2016-02-05 10:07
Windows Form, jak zwykle zapomniałem o tym napisać w pierwszym poście :/ - hipekk 2016-02-05 10:10
moja odpowiedz byla pod wpf... - fasadin 2016-02-05 10:31

Pozostało 580 znaków

2016-02-05 10:33

Rejestracja: 8 lat temu

Ostatnio: 11 godzin temu

0

jako ze wczesniej pisalem pod wpf odpowiedz to teraz pod winforms
http://stackoverflow.com/ques[...]w-populating-the-datagridview
http://stackoverflow.com/ques[...]nd-to-datagridview-datasource

Pozostało 580 znaków

2016-02-06 01:21
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

0

Jaką rozdzielczość ma monitor, na którym chcesz wyświetlić 1400 wierszy?

Dane z bazy pobiera się w pakietach sensownej wielkości, a nie wszystko na raz.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0