PDA

View Full Version : صفحه بندی دیتاگرید



nafisehk
شنبه 30 شهریور 1392, 13:21 عصر
سلام

من یه جدول و 3 تا گرید دارم.
گرید اول شامل همه ی رکوردهای جدول هستش
و دو تاگرید دیگه فیلتری از اون جدول هستند(یک بار جدول و میخونم و در دیتاتیبل قرار میدم و برای گرید 2 و 3 اون دیتاتیبل و فیلتر میکنم )

حالا میخوام دیتاگرید و صفحه بندی کنم دیتاگرید اول مشکلی نداره اما برا دومی و سومی نمیتونم paging و رو datatable اعمال کنم و باید هر سری از جدول به ازای هر page بخونم . datagrid تو C#‎ خصوصیتallowpaging نداره؟


ممنون میشم راهنماییم کنید....

veniz2008
شنبه 30 شهریور 1392, 14:08 عصر
سلام

من یه جدول و 3 تا گرید دارم.
گرید اول شامل همه ی رکوردهای جدول هستش
و دو تاگرید دیگه فیلتری از اون جدول هستند(یک بار جدول و میخونم و در دیتاتیبل قرار میدم و برای گرید 2 و 3 اون دیتاتیبل و فیلتر میکنم )

حالا میخوام دیتاگرید و صفحه بندی کنم دیتاگرید اول مشکلی نداره اما برا دومی و سومی نمیتونم paging و رو datatable اعمال کنم و باید هر سری از جدول به ازای هر page بخونم . datagrid تو C#‎ خصوصیتallowpaging نداره؟

سلام.
در app متاسفانه گرید بصورت پیش فرض امکان صفحه بندی نداره (در وب داریم).
من گمان میکنم شما صفحه بندی نمیخوای!!! بلکه قصدت اینه که گرید دوم و سوم رو با توجه به گرید اول فیلتر کنی. چون بحث صفحه بندی ارتباطی به این چیزی که گفتید نداره.
اگر منظورتون فیلتر کردن هست که میتونید از از دیتاتیبل defaultview بگیرید و بعدش از خصوصیت RowFilter برای فیلتر کردن استفاده کنید.
اگر هم میخواید همون دیتاتیبل رو صفحه بندی کنید میتونید دو متغیر برای شروع و پایان بگیرید (مثلا برای صفحات 20 تایی شروع 0 و پایان 19 ، با زدن دکمه بعدی به هر کدوم 20 تا اضافه کنید و دیتاتیبل فیلتر شده رو با توجه به مقدار این دو متغیر صفحه بندی کنید.

nafisehk
شنبه 30 شهریور 1392, 14:25 عصر
ممنون از توجهتون دوست عزیز

بحثم دقیقا صفحه بندی هستش

هدفم این بود که یک بار کل داده هارو تو یه دیتاتیبل بریزم و از اون دیتاتیبل برای صفحه بندی استفاده کنم . میخوام ببینم این امکان وجود داره یا باید برای دو تاگرید بعدی هم دوباره داده ها رو از db بخونم

nafisehk
شنبه 30 شهریور 1392, 14:41 عصر
این نمونه سورسی هستش که تو Codeproject دیدم


namespace WindowsFormsApplication1


{

publicpartialclassForm1 : Form


{

privateint pagesize = 20;

privateint currentpageindex = 1;

privateint totalpage = 0;

SqlCommand mySqlcomand;

SqlDataAdapter mySqlDataAdapter = newSqlDataAdapter();

DataTable myDataTable = newDataTable();

SqlConnection mySqlConnection = newSqlConnection("Data Source=.;Initial Catalog=phonebook;Integrated Security=True");

public Form1()


{

InitializeComponent();

}

privatevoid CalculateTotalPages()


{

int rowcount = myDataTable.Rows.Count;


totalpage = rowcount / pagesize;

if (rowcount % pagesize>0)


totalpage += 1;



}

privateDataTable getcurrenrrecord(int page, SqlConnection con)


{



DataTable myDataTable = newDataTable();

if (page == 1)


{

mySqlcomand = newSqlCommand("select TOP " + pagesize + " * from tblContacts ORDER BY contactid", mySqlConnection);


}

else


{

int prepageoffset = (page - 1) * pagesize;

mySqlcomand = newSqlCommand("select TOP " + pagesize + " * from tblContacts WHERE contactid NOT IN " + "(select TOP " + prepageoffset + " contactid from tblContacts ORDER BY contactid)", mySqlConnection);


}

try


{

this.mySqlDataAdapter.SelectCommand = mySqlcomand;

this.mySqlDataAdapter.Fill(myDataTable);


}

finally


{

mySqlConnection.Close();

}

return myDataTable;


}

privatevoid Form1_Load(object sender, EventArgs e)


{

SqlCommand mysqlCommand = newSqlCommand("select * from tblContacts", mySqlConnection);


mySqlDataAdapter.SelectCommand = mysqlCommand;

mySqlDataAdapter.Fill(myDataTable);

CalculateTotalPages();

}





privatevoid first_Click(object sender, EventArgs e)


{

this.currentpageindex = 1;

this.dataGridView1.DataSource = getcurrenrrecord(this.currentpageindex, mySqlConnection);


}

privatevoid nex_Click(object sender, EventArgs e)


{

if(this.currentpageindex<this.totalpage)


{

this.currentpageindex++;

this.dataGridView1.DataSource=getcurrenrrecord(thi s.currentpageindex,mySqlConnection);


}

}

privatevoid pre_Click(object sender, EventArgs e)


{

if (this.currentpageindex > 1)


{

this.currentpageindex--;

this.dataGridView1.DataSource=getcurrenrrecord(thi s.currentpageindex, mySqlConnection);


}

}

privatevoid last_Click(object sender, EventArgs e)


{

this.currentpageindex = totalpage;

this.dataGridView1.DataSource=getcurrenrrecord(thi s.currentpageindex,mySqlConnection);


}

}

}

کل جدول و یک بار تو لود فرم میخونه که فقط بفهمه جند تا رکورد داره؟؟؟!!!

nafisehk
شنبه 30 شهریور 1392, 15:13 عصر
دوستان لطفا راهنمایی بفرمایید

mousa1992
شنبه 30 شهریور 1392, 17:55 عصر
هدف از صفحه بندی گرید چیه ؟ میخوایم لود اطلاعات رو سریع تر کنیم و همچنین از شلوغی زیاد جلوگیری کنیم برا دسترسی راحت تر به داده ها
خب شما اومدین اول کل اطلاعات رو ریختین توی ی datatable که اولین اشتباهه ( هم رمو اشغال کردین بخصوص وقتی که داده ها زیاد باشن دچار مشکل میشین و هم سرعت لود رو کم کردین )
توی کدی هم که قرار دادین مثل شما عمل نکرده
متد
getcurrenrrecord(int page, SqlConnection con) رو بدقت بررسی کنید
متوجه میشید که فقط رکورد هایی رو که مربوط به page ارسال شده هست برمیگردونه (البته اشتباه هم داره ک درستشو قرار میدم و بررسی کنید !! )



mySqlcomand = newSqlCommand("select TOP " + pagesize * page + " * from tblContacts WHERE contactid NOT IN " + "(select TOP " + prepageoffset + " contactid from tblContacts ORDER BY contactid)", mySqlConnection);



با این وضعیت دیگه نیازی به نوشتن اون دستور شرطی برای بررسی اینکه صفحه یک هست یا نه هم نداریم
خب توضیح در مورد query :

به اندازه pagesize * page رکوردها رو برمیگردونه - اونایی که توی select دوم هستن

خب حالا با ی مثال عددی صحتش رو بررسی میکنیم

فرض کنید page = 3 and pagesize = 20

حالا کوئری ما میگه که 60 رکورد اول رو برگردون به شرطی که contactid شون توی مجموعه دوم نباشه ( که مجموعه دوم فقط شامل contactid رکورد ها هست ) خب مجموعه دوم هم رکورد های 1 تا 40 رو شامل میشه حالا مجموعه 60 تای بالایی - 40 تای بالایی میشه چی ؟ میشه 20 تای سوم

خب امیدوارم که متوجه شده باشین قضیه رو


Edit
tip : use c# tag for show your code


موفق باشید

nafisehk
یک شنبه 31 شهریور 1392, 08:44 صبح
هدف از صفحه بندی گرید چیه ؟ میخوایم لود اطلاعات رو سریع تر کنیم و همچنین از شلوغی زیاد جلوگیری کنیم برا دسترسی راحت تر به داده ها
خب شما اومدین اول کل اطلاعات رو ریختین توی ی datatable که اولین اشتباهه ( هم رمو اشغال کردین بخصوص وقتی که داده ها زیاد باشن دچار مشکل میشین و هم سرعت لود رو کم کردین )
توی کدی هم که قرار دادین مثل شما عمل نکرده
متد
getcurrenrrecord(int page, SqlConnection con) رو بدقت بررسی کنید
متوجه میشید که فقط رکورد هایی رو که مربوط به page ارسال شده هست برمیگردونه (البته اشتباه هم داره ک درستشو قرار میدم و بررسی کنید !! )



mySqlcomand = newSqlCommand("select TOP " + pagesize * page + " * from tblContacts WHERE contactid NOT IN " + "(select TOP " + prepageoffset + " contactid from tblContacts ORDER BY contactid)", mySqlConnection);



با این وضعیت دیگه نیازی به نوشتن اون دستور شرطی برای بررسی اینکه صفحه یک هست یا نه هم نداریم
خب توضیح در مورد query :

به اندازه pagesize * page رکوردها رو برمیگردونه - اونایی که توی select دوم هستن

خب حالا با ی مثال عددی صحتش رو بررسی میکنیم

فرض کنید page = 3 and pagesize = 20

حالا کوئری ما میگه که 60 رکورد اول رو برگردون به شرطی که contactid شون توی مجموعه دوم نباشه ( که مجموعه دوم فقط شامل contactid رکورد ها هست ) خب مجموعه دوم هم رکورد های 1 تا 40 رو شامل میشه حالا مجموعه 60 تای بالایی - 40 تای بالایی میشه چی ؟ میشه 20 تای سوم

خب امیدوارم که متوجه شده باشین قضیه رو


Edit
tip : use c# tag for show your code


موفق باشید

مرسییی
مشکل منم دقیقا همینه که کل جدول و تو لود فرم میخونه که تعداد رکوردارو بدست بیاره. اگه همه جدول و نخونم از کجا تعداد رکوردارو که برا پیمایش نیاز دارم بدست بیارم؟

nafisehk
یک شنبه 31 شهریور 1392, 09:18 صبح
مرسییی
مشکل منم دقیقا همینه که کل جدول و تو لود فرم میخونه که تعداد رکوردارو بدست بیاره. اگه همه جدول و نخونم از کجا تعداد رکوردارو که برا پیمایش نیاز دارم بدست بیارم؟

ممنون از راهنماییتون حل شد :)

mousa1992
یک شنبه 31 شهریور 1392, 10:15 صبح
چجوری حلش کردی ؟ نیاز نیست همه رکوردهارو بازیابی کنی برا بدست اوردن تعداد
از تابع count استفاده کن

nafisehk
پنج شنبه 04 مهر 1392, 12:45 عصر
چجوری حلش کردی ؟ نیاز نیست همه رکوردهارو بازیابی کنی برا بدست اوردن تعداد
از تابع count استفاده کن


با همون Count

+
اگه Id ها صعودی باشن میشه بزرگترین id و تو هربارخوندن نگه داشت
و COmmandtextرو هم به این شکل نوشت که فقط یه selectداشته باشیم

select TOP 100 * from tblContacts WHERE contactid>maxid

behnamgholipoor
شنبه 01 آذر 1393, 20:12 عصر
کسی هست بیشتر توضیح بده ؟