PDA

View Full Version : سریع ترین راه پر کردن یه ListView ؟



samprp
شنبه 07 اردیبهشت 1387, 19:20 عصر
سلام دوستان
من تو یه برنامه با ADOQuery1 داده ها رو گرفتم و حالا می خوام اونا رو بریزم تو یه Listview.
(در ضمن اونجا هم که نوشته listbox من خودم اسمشو عوض کردم.)

حالا سوال من اینه که سریع ترین راه برای پر کردن این لیست ویو با داده های این ادو کوئری چی هستش . این روش زیر خیلی طول می کشه . در صورتی که اگر از DbGrid استفاده کنید سرعت خیلی بالاست (همون که به پایگاه داده ربطش بدیم.).





ADOQuery1.First;

while not ADOQuery1.Eof do
begin
with ListBox1.Items.Add do
begin
Caption:=ADOQuery1.FieldByName('stuff_name').AsStr ing;
SubItems.Add(ADOQuery1.FieldByName('stuff_CardNumb er').AsString);
SubItems.Add(ADOQuery1.FieldByName('stuff_Store_1' ).AsString);
SubItems.Add(ADOQuery1.FieldByName('stuff_Store_2' ).AsString);
SubItems.Add(ADOQuery1.FieldByName('stuff_Store_3' ).AsString);
SubItems.Add(ADOQuery1.FieldByName('stuff_Store_4' ).AsString);
end;
ADOQuery1.Next;
end;


پیشاپیش ممنون از راهنماییهاتون.

vcldeveloper
شنبه 07 اردیبهشت 1387, 19:53 عصر
قبل از while:
ADOQuery1.DisableControls

بعد از While:
ADOQuery1.EnableControls

در واقع اینطوری میشه:


ADOQuery1.DisableControls;
ListView1.Items.BeginUpdate;
try
while ....
....
finally
ListView1.Items.EndUpdate;
ADOQuery1.EnableControls;
end;

samprp
شنبه 07 اردیبهشت 1387, 20:31 عصر
علی جان عالی بود.
سرعتش خیلی بالا رفت.

می شه فقط یه توضیح کوچولو در مورد دستورات بدین . ممنون می شم.

vcldeveloper
شنبه 07 اردیبهشت 1387, 22:36 عصر
DisableControls زمانی که روی رکوردها حرکت می کنید، مانع از آپدیت کنترل های Data-aware میشه. استفاده ازش چه DataSource ایی به DataSet وصل باشه، چه نباشه، سرعت حرکت بین رکوردها رو افزایش میده.
BeginUpdate مانع از این میشه که تا قبل از فراخوانی EndUpdate محتویات جدید Item های ListView نمایش داده بشند. یعنی بجای اینکه با تغییر هر Item یک بار اون بخش از صفحه رسم بشه، کل Item ها آپدیت میشند، بعد یک بار رسم انجام میشه.

علاوه بر اینها که مربوط به سمت کلاینت میشند، می تونید در سمت سرور این کارها رو هم انجام بدید:
1- بررسی کنید تمام فیلدهایی که در کوئری استفاده می کنید، یا حداقل فیلدهایی که بر اساس آنها جستجو انجام می دید یا در کوئری شرط میزارید، Index داشته باشند
2- بجای ساختن کوئری در سمت کلاینت، آن را بصورت یک Stored Procedure در سرور ذخیره کنید و از کلاینت SP ساخته شده را فراخوانی کنید.
3- فقط رکوردهایی که نیاز دارید را از سرور درخواست کنید، نه همه رکوردهای یک جدول را.