Długi czas wczytywania DataSet do DataGridView

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:

0000.0001324 Step DataSet dataSet = null
0000.0001645 Step dataSet = msSQL.pobierzListeDokumentow(dtpDateFrom.Value, dtpDateTo.Value)
0000.0177362 Step dataGridView1.DataSource = dataSet.Tables[0]
0033.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.

0

Spróbuj to:

dataGridView1.SuspendDrawing();
dataGridView1.DataSource = dataSet.Tables[0];
dataGridView1.ResumeDrawing();
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 :/

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.

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