Archief - C#: DataGridView paging dmv scrollen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

InFerNo

Legacy Member
Ik wil een Datagridview vullen met data dmv scrolling.
Laat ons zeggen dat ik 50 records in de DGV laad, wanneer ik aan het einde van deze lijst ben gescrolt zou hij de volgende 50 moeten inladen en er bij zetten. De vorige rijen mogen blijven staan.

Iemand een idee hoe ik dat kan bewerkstellen?
Ik heb al gegoogled, maar die voorbeelden zijn vaak ingewikkeld of toch iets anders dan ik wil :(

Om u een idee te geven:
Code:
            SqlConnection conn = clsCommonFunctions.cInstance.connection;

            SqlCommand command = new SqlCommand(
            "SELECT c.vc50_Title, c.vc50_LastName, c.vc50_FirstName, l.vc10_Code, g.vc10_Code, a.vc255_Street1, c.vc255_Remarks " +
            "FROM tbl_Contact c, tbl_Language l, tbl_Gender g, tbl_Address a " +
            "WHERE l.num_Id = c.num_LanguageId " +
            "AND c.num_GenderId = g.num_Id " +
            "AND c.num_AddressId = a.num_Id " +
            "LIMIT " + uloCurrentSetBottom.ToString() + "," + intRange.ToString()
            , conn);


            SqlDataReader reader = command.ExecuteReader();

            int i = 0;

            //Voorbeeld voor unbound dgv, vullen met do while?
            while (reader.Read())
            {
                dgvContacts.Rows[i].Cells[0].Value = reader[0];
                dgvContacts.Rows[i].Cells[1].Value = reader[1];
                dgvContacts.Rows[i].Cells[2].Value = reader[2];
                dgvContacts.Rows[i].Cells[3].Value = reader[3];
                dgvContacts.Rows[i].Cells[4].Value = reader[4];
                dgvContacts.Rows[i].Cells[5].Value = reader[5];
                dgvContacts.Rows[i].Cells[6].Value = reader[6];
                i++;
            }

            reader.Close();
            conn.Dispose();

FYI: deze code compiled niet omdat ik nog met die LIMIT zit te prullen o.a., het is maar om een idee te geven hoe ik de data ophaal en in de DGV steek

Als u liever alles in kleurtjes ziet:
[C#] Paging by scrolling - Pastebin.com

InFerNo

Legacy Member
Ik wou paging in die SQL query steken maar blijkbaar bestaat er geen LIMIT in MSSQL, wel een TOP, maar die heeft geen range, iemand een alternatief? :( Het gaat om de SQL string in de OP.

InFerNo

Legacy Member
Ghoh, hoe doe ik dat :s
Geen flauw idee hoe ik mijn huidige SQL strings nog kan gebruiken om te mixen met LINQ.

Die link toont enkel de LINQ Skip en Take methode.
Alle gegevens ophalen uit de DB en dan filteren zie ik ook ni echt zitten = defeating the purpose :(

Ik ken ni echt veel van LINQ :p

Moto

Legacy Member
Ik ken ni echt veel van LINQ
als er iets is dat ge moet leren is het wel Linq

Anyway ten eerste die DB, die naamgevingen "tbl_", "num_", is toch gewoon tenenkrullend onnozel, doe dat NIET, als ge denkt goede redenen te hebben om die prefixen te gebruiken, dan kan ik nu al zeggen dat die redenen fout zijn

Daarnaast gebruikt een ORM, nog beter gebruikt deze orm Documentation - Business Logic Toolkit for .NET

Alle gegevens ophalen uit de DB en dan filteren zie ik ook ni echt zitten = defeating the purpose
Take + Skip worden omgezet naar het juiste SQL statement

Om het effe aan te tonen die ORM download staat een mooi Linq.Demo.2010 projectje vb

Code:
var query = from c in db.Category
		from p in db.Product
                where p.CategoryID == c.CategoryID && 
                         p.UnitsInStock < 2
		select new 	{ c.CategoryName, p.ProductName };

Ik veronderstel dat ge dit direkt begrijpt (kent dus toch wel iets van Linq ;) )
Zie dus ook al direkt de voordelen geen strings en intellisense

dit uitvoeren met "query.ToList()" genereerd

SELECT
[c].[CategoryName],
[t1].[ProductName]
FROM
[Categories] [c], [Products] [t1]
WHERE
[t1].[CategoryID] = [c].[CategoryID] AND [t1].[UnitsInStock] < 2

doen we de eerste 20 dus "query.Take(20).ToList()" genereerd

Code:
SELECT TOP (20)
	[c].[CategoryName],
	[t1].[ProductName]
FROM
	[Categories] [c], [Products] [t1]
WHERE
	[t1].[CategoryID] = [c].[CategoryID] AND [t1].[UnitsInStock] < 2

en doen we de 21-40 met "query.Skip(20).Take(20).ToList()" dan krijg je

Code:
SELECT *
FROM
(
	SELECT
		t.*,
		ROW_NUMBER() OVER
		(
			ORDER BY
				t.[CategoryName],
				t.[ProductName]
		) as rn
	FROM
	(
		SELECT
			[c].[CategoryName],
			[t1].[ProductName]
		FROM
			[Categories] [c], [Products] [t1]
		WHERE
			[t1].[CategoryID] = [c].[CategoryID] AND [t1].[UnitsInStock] < 2
	) t
) t2
WHERE
	t2.rn BETWEEN 21 AND 40

Tyfius

Legacy Member
Ik had hem ook al is linq aangeraden. Maar om het simpel te houden gewoon vanuit VS linq to sql classes gegenereerd. Dat werkt voor hem evengoed dan daar nog is rap die BLT tussen te gaan gooien.

Moto

Legacy Member
Ah Linq to Sql is den andere ORM die er ook mee door kan, maar voor Blt kan men ook op meerdere manieren zoals T4 templates. grootste minpunt voor mij van L-2-SQL is SQL Server only

Gewoon zeker als beginner ver weg blijven van NH en zeker EF :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan