PDA

View Full Version : ساخت گرید ویو با UserControl در سی شارپ



arastoahmadi
شنبه 20 اردیبهشت 1399, 18:54 عصر
سلام به همه اساتید گرامی

دوستان من توسی شارپ با استفاده از Usercontrol یه گرید ویو طراحی کرده ام به این صورت که اگر جدول من شامل 100 تا رکورد باشه گرید ویو به صورت خودکار از 1 تا 10 صفحه بندی خواهد شد و تو هر صفحه 10 تا رکورد رو نمایش میده منتها مشکلی که اینجا وجود دارد رو هر شماره که کلیک میکنم یه چند ثانیه برنامه مکث میکنه بعد نمایش میده دوستان چه چیزی پیشنهاد میدید که با سرعت و بدون مکث این عمل انجام یشه ، چون من تو کدها مثلا اگه بخام رکورد 1 تا 10 رو با شماره گذاری 1 نمایش بدم باید یه حلقه for بنویسم از 1 تا 10 رو از جدول بخونه بعد سطر به سطر نشون بده . دوستان ممنون میشم یه راهنمایی بفرمایید

the king
شنبه 20 اردیبهشت 1399, 19:15 عصر
سلام به همه اساتید گرامی

دوستان من توسی شارپ با استفاده از Usercontrol یه گرید ویو طراحی کرده ام به این صورت که اگر جدول من شامل 100 تا رکورد باشه گرید ویو به صورت خودکار از 1 تا 10 صفحه بندی خواهد شد و تو هر صفحه 10 تا رکورد رو نمایش میده منتها مشکلی که اینجا وجود دارد رو هر شماره که کلیک میکنم یه چند ثانیه برنامه مکث میکنه بعد نمایش میده دوستان چه چیزی پیشنهاد میدید که با سرعت و بدون مکث این عمل انجام یشه ، چون من تو کدها مثلا اگه بخام رکورد 1 تا 10 رو با شماره گذاری 1 نمایش بدم باید یه حلقه for بنویسم از 1 تا 10 رو از جدول بخونه بعد سطر به سطر نشون بده . دوستان ممنون میشم یه راهنمایی بفرمایید

از قابلیت VirtualMode در DataGridView استفاده کنید، اگر درست اجرا بشه علاوه بر سرعت بالا حتی دیگه نیازی به صفحه بندی نخواهد بود.
رجوع شود به :
افزایش سرعت پردازش برنامه در C# (https://barnamenevis.org/showthread.php?559016-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%D8%B9%D8%AA-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%AF%D8%B1-C)

arastoahmadi
یک شنبه 21 اردیبهشت 1399, 07:39 صبح
ممنون از پاسختون دوست عزیز اما GridView من کنترل پیش فرض ویژوال استودیو و یا کنترل های آماده نیست من خودم یه پنل آوردم که تو این پنل آیتم ها زیر هم قرار میگیره و به شکل یه گرید ویو سطرهای یه جدول رو نشون میده حالا من برای اینکه بخام سرعت و پردازش داده ها رو تسریع ببخشم باید چکار کنم

the king
یک شنبه 21 اردیبهشت 1399, 08:40 صبح
ممنون از پاسختون دوست عزیز اما GridView من کنترل پیش فرض ویژوال استودیو و یا کنترل های آماده نیست من خودم یه پنل آوردم که تو این پنل آیتم ها زیر هم قرار میگیره و به شکل یه گرید ویو سطرهای یه جدول رو نشون میده حالا من برای اینکه بخام سرعت و پردازش داده ها رو تسریع ببخشم باید چکار کنم

ایتم ها صرفا نمایشی هستند؟ نمایش کادر و متن با Graphics به مراتب سریعتر و با حافظه مورد نیاز کمتر نسبت از اضافه کردن تعداد زیادی کنترل ئه. به اصطلاح تا جایی که ممکنه Windowless کار کنید، کنترل هایی که اضافه می کنید پنجره دارند، مدیریت پنجره حافظه بیشتری میخواد و سربار پردازشی داره.

arastoahmadi
یک شنبه 21 اردیبهشت 1399, 09:33 صبح
ممنون از پاسختون دوست عزیز ، من عکس هاشو گذاشتم شما ملاحظه بفرمایید به عنوان مثال من تو صفحه 1 جدولم هستم و میخام صفحه 2 رو ببینم اول میاد به ترتیب زیر سطر به سطر قرار میده منتها تو اون لحظه صفحه واسه چند ثانیه هنگ میکنه ممنون میشم راهنمایی کنید

151680

151681

151682

the king
یک شنبه 21 اردیبهشت 1399, 11:11 صبح
ممنون از پاسختون دوست عزیز ، من عکس هاشو گذاشتم شما ملاحظه بفرمایید به عنوان مثال من تو صفحه 1 جدولم هستم و میخام صفحه 2 رو ببینم اول میاد به ترتیب زیر سطر به سطر قرار میده منتها تو اون لحظه صفحه واسه چند ثانیه هنگ میکنه ممنون میشم راهنمایی کنید.

سه تا سوال دارم.

برنامه Windows Forms یا WPF ئه؟
موقعی که روی دکمه صفحه 2 کلیک میشه چیکار می کنید؟ با ()Panel.Controls.Clear محتویات Panel رو پاک می کنید و بعد تک تک کنترل های جدید رو به داخل Panel اضافه می کنید؟ یا بجای اینکار کنترل های بجا مونده از صفحه قبلی رو حفظ می کنید و صرفا متن شون رو مطابق با اطلاعات صفحه جدید تغییر می دهید؟
موقعی که میخواد صفحه دیگری انتخاب بشه، اطلاعات مورد نیاز اون سطر های اون صفحه از قبل آماده و موجود ئه یا تازه قراره بعد از کلیک کردن داده های صفحه از بانک اطلاعاتی یا شبکه دریافت بشه؟

arastoahmadi
یک شنبه 21 اردیبهشت 1399, 17:53 عصر
سلام مجدد خدمت شما دوست گرامی

من برنامه رو با WinForms نوشتم

ببینید دوست خوبم من طیق فرمایش شما موقعی که روی دکمه صفحه 2 کلیک میکنم کنترل های داخل پنل با دستور panel.controls.clear پاک میشه و بعد تک تک کنترل های جدید به پنل اضافه یشه ، سوال بعدیتون که فرموده بودید اطلاعات مورد نیاز سطرها از قبل آماده هستش یا از پایگاه داده فراخوانی میشه ، نه اطلاعات هر صفحه از پایگاه داده فراخوانی و به پنل اضافه میشه .

ممنون میشم راه حل بهینه و استانداری پیشنهاد بدید، بسیار سپاسگذارم ازتون

the king
دوشنبه 22 اردیبهشت 1399, 11:24 صبح
سلام مجدد خدمت شما دوست گرامی

من برنامه رو با WinForms نوشتم

ببینید دوست خوبم من طیق فرمایش شما موقعی که روی دکمه صفحه 2 کلیک میکنم کنترل های داخل پنل با دستور panel.controls.clear پاک میشه و بعد تک تک کنترل های جدید به پنل اضافه یشه ، سوال بعدیتون که فرموده بودید اطلاعات مورد نیاز سطرها از قبل آماده هستش یا از پایگاه داده فراخوانی میشه ، نه اطلاعات هر صفحه از پایگاه داده فراخوانی و به پنل اضافه میشه .

ممنون میشم راه حل بهینه و استانداری پیشنهاد بدید، بسیار سپاسگذارم ازتون
این همون DataGridView استاندارد Windows Forms ئه، بدون کوچکترین دستکاری در کلاس اش :
151686
تنها کاری که انجام می دهیم اینه که روال رسم اش رو تغییر می دهیم. مثل نمایش تاریخ شمسی و نمایش عنوان و محتویات سطر ها.
وگرنه مرتب سازی، تغییر اندازه ستون ها و ... همه مال خود کلاس DataGridView میمونه، بهشون دست نمی زنیم.
ببینید وقتی 1000 تا سطر بهش اضافه میشه و مرتب سازی بر اساس یک ستون انتخابی رو انجام میده اون یکی دو ثانیه سکته رو می کنه؟

151687

تا جایی که امکانش هست از ساختن کنترل های جدید روی فرم اجتناب کنید. اگر DataGridView کارتون رو راه می اندازه ازش استفاده کنید و اگر نمیشه با Graphics خودتون رسم کنید. بخاطر نمایش صرفا چند تا متن و آیکون کنترل اضافه نکنید، سربار رسم و مدیریت شون زیاده.

arastoahmadi
دوشنبه 22 اردیبهشت 1399, 15:08 عصر
ممنون از پاسختون دوست گرامی 3 تا سوال دیگه :

1- حالا من اگه بخام به جای شماره موضوع ها یعنی اعداد 189 ، 871 و ... کنترل checkbox و یا هرکنترل دیگه ای درج کنم باید از چه دستوری برای اینکار استفاده کنم.

2- اگه بخام "پاسخ داده شد" رو سبز نشون بدم ، "بسته شد" رو قرمز و "منتظر پاسخ " رو زرد نشون بدم باید چکار کنم

3- شماره بندی صفحه رو باید چکار کنم طوری که 1000 تا رکوردمو تو 10 صفحه به صورت خودکار صفحه بندی کنه


ممنون میشم راهنمایی بفرمایید

the king
دوشنبه 22 اردیبهشت 1399, 17:11 عصر
ممنون از پاسختون دوست گرامی 3 تا سوال دیگه :

1- حالا من اگه بخام به جای شماره موضوع ها یعنی اعداد 189 ، 871 و ... کنترل checkbox و یا هرکنترل دیگه ای درج کنم باید از چه دستوری برای اینکار استفاده کنم.

اگر مساله صرفا نمایش باشه که رسم می کنید، مثلا اون شماره سطر فقط رسم ئه، کنترلی نداره.
اما اگر قراره بجز نمایش کاری هم انجام بده، مثلا با کلیک تیک اش تغییر کنه، در انواع دلخواه تون ستون اضافه می کنید.
در DataGridView نوع DataGridViewTextBoxColumn پیشفرض ئه که TextBox ئه ولی می توانید ستون های دیگری مثل DataGridViewCheckBoxColumn رو اضافه کنید که یک CheckBox ئه. اگر خواستید با رسم پیشفرض انجام بشه، باید در رخداد DataGridView.CellPainting جلوی e.Handled = true رو برای اون ستون بگیرید، چون اگه e.Handled = true بشه دیگه رسم پیشفرض CheckBox رو انجام نمیده. مثلا اگر ستون اندیس 3 یک ChecknBox ئه :

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if ((e.RowIndex < -1) || (e.RowIndex >= dataGridView1.RowCount) || (e.ColumnIndex < 0) || (e.ColumnIndex >= dataGridView1.Columns.Count))
{
return;
}
if ((e.ColumnIndex == 3) && (e.RowIndex >= 0))
{
return;
}
e.Handled = true;
.
.
.





2- اگه بخام "پاسخ داده شد" رو سبز نشون بدم ، "بسته شد" رو قرمز و "منتظر پاسخ " رو زرد نشون بدم باید چکار کنم

رنگ بندی جالبی نمیشه اما به هر حال برای Brush ای که در DrawString بکار میره (textBrush) شرط میذارید، مثلا :

e.Graphics.FillRectangle((selected) ? Brushes.LightBlue : ((e.RowIndex % 2 == 0) ? Brushes.WhiteSmoke : Brushes.White), e.CellBounds);
Brush textBrush;
switch (e.ColumnIndex)
{
case 3:
switch (text)
{
case "بسته شده":
textBrush = Brushes.Red;
break;
case "پاسخ داده شد":
textBrush = Brushes.ForestGreen;
break;
case "منتظر پاسخ":
textBrush = Brushes.Yellow;
break;
default:
textBrush = Brushes.Black;
break;
}
break;
default:
textBrush = Brushes.Black;
break;
}
var format = new StringFormat(StringFormat.GenericDefault);




3- شماره بندی صفحه رو باید چکار کنم طوری که 1000 تا رکوردمو تو 10 صفحه به صورت خودکار صفحه بندی کنه

یک لیست برای نگهداری تمامی سطر ها داشته باشید، مثل private List<DataGridViewRow> _rows که موقع نمایش هر صفحه با خیال راحت محتویات قبلی DataGridView رو حذف کنه و فقط همون 10 سطر رو در DataGridView درج کنه.

arastoahmadi
سه شنبه 23 اردیبهشت 1399, 08:41 صبح
سلام

دوست عزیز صمیمانه از شما به خاطر لطف و راهنماییتون تشکر و قدردانی میکنم ، پس طبق فرمایش شما برای درج کنترل در گرید ویو باید حتما یه ستون بهش اختصاص داده بشه یعنی از طریق رویداد Painting امکان پذیر نیست ؟

بعد من از کامپوننت های DevExpress و .net Component استفاده میکنم که کنترل های جالبی هم داره و من میخام از این کنترل ها در گرید ویو استفاده کنم به عنوان مثال برای درج دکمه در گرید ویو من تاجایی که با گرید ویو کار کردم از کنترل های پیش فرض سی شارپ استفاده میکنه البته من خیلی با گرید ویو آشنایی ندارم شاید راهی باشه که بشه از کنترل های DevExpress نیز استفاده کرد ممنون میشم منو راهنمایی کنید.

mrsp1988
سه شنبه 23 اردیبهشت 1399, 10:28 صبح
قسمت کد تغییر رنگ رو توی کدوم خاصیت باید نوشت

the king
سه شنبه 23 اردیبهشت 1399, 10:47 صبح
سلام

دوست عزیز صمیمانه از شما به خاطر لطف و راهنماییتون تشکر و قدردانی میکنم ، پس طبق فرمایش شما برای درج کنترل در گرید ویو باید حتما یه ستون بهش اختصاص داده بشه یعنی از طریق رویداد Painting امکان پذیر نیست ؟

Painting رسم ئه، می نوانید داخلش CheckBox ای رو رسم کنید اما فقط عکس CheckBox ئه، کنترل نیست. درج کنترل اصلا ارتباطی با رسم DataGridView نداره.
اگر بخواهید CheckBox ئه کار کنه، با کلیک کردن تیک اش تغییر کنه، موقعی که ماوس رویش میره رنگش تغییر کنه و ... باید ستونی برای اینکار داشته باشید. می توانید از صفر CheckBox بسازید ولی دلیلی نداره چرخ رو از نو اختراع کنید.




بعد من از کامپوننت های DevExpress و .net Component استفاده میکنم که کنترل های جالبی هم داره و من میخام از این کنترل ها در گرید ویو استفاده کنم به عنوان مثال برای درج دکمه در گرید ویو من تاجایی که با گرید ویو کار کردم از کنترل های پیش فرض سی شارپ استفاده میکنه البته من خیلی با گرید ویو آشنایی ندارم شاید راهی باشه که بشه از کنترل های DevExpress نیز استفاده کرد ممنون میشم منو راهنمایی کنید.
فکر نکنم بتوانید کنترل هایی که با هم سازگار نیستند رو ترکیب کنید.

the king
سه شنبه 23 اردیبهشت 1399, 10:50 صبح
قسمت کد تغییر رنگ رو توی کدوم خاصیت باید نوشت

هیچ مشخصه ای، در کدتون یک سطر برای تعریف و مقدار دهی textBrush داشتید که خیلی ساده بود :

var textBrush = (e.ColumnIndex == 3) ? Brushes.Gray : Brushes.Black;

که اون رو توسعه می دهید :

Brush textBrush;

switch (e.ColumnIndex)

{

case 3:

switch (text)

{

case "بسته شده":
textBrush = Brushes.Red;

break;

case "پاسخ داده شد":

textBrush = Brushes.ForestGreen;

break;

case "منتظر پاسخ":
textBrush = Brushes.Yellow;
break;

default:

textBrush = Brushes.Black;

break;

}

break;

default:

textBrush = Brushes.Black;

break;

}

arastoahmadi
سه شنبه 23 اردیبهشت 1399, 11:59 صبح
دوست عزیز به خدا نمیتونم چطوری تشکر کنم ازتون خیلی پرفکت بود توضیحتون ، ولی بحث گرید ویو یه مقدار گیج کننده س واقعا ، من فقط میخام بگم که وقتی تو انی دسک به هزاران سیستم ریموت میشیم این تو کش انی دسک میمونه و جالب اینکه فکر کنم اطلاعات کانکشن سیستم از راه دور رو به صورت RealTime نشون میده ، اگه شکل زیرو ملاحظه بفرمایید آی دی مشتریا مثل رکوردهای گرید ویو زیر هم قرار گرفته با این تفاوت که داخل آن کنترل های وجود داره که جنبه نمایشی نداره بلکه میتونی عملیاتی از قبیل کانکت شدن و سایر موارد رو انجام داد که میتونید در شکل زیر مشاهده کنید میخواستم بدونم آیا واقعا این گرید ویو هستش یا یه پنله یا یه کنترل دیگه س اگه من بخام اطلاعات مشریامو به این شکل نمایش بدم باید از چه کنترلی استفاده کنم



151691


151692

دوستان تو این از چه کنترل هایی استفاده شده که بسیار سریع اطلاعات میلیون ها مشتری رو لیست خواهد کرد

the king
سه شنبه 23 اردیبهشت 1399, 14:41 عصر
دوست عزیز به خدا نمیتونم چطوری تشکر کنم ازتون خیلی پرفکت بود توضیحتون ، ولی بحث گرید ویو یه مقدار گیج کننده س واقعا ، من فقط میخام بگم که وقتی تو انی دسک به هزاران سیستم ریموت میشیم این تو کش انی دسک میمونه و جالب اینکه فکر کنم اطلاعات کانکشن سیستم از راه دور رو به صورت RealTime نشون میده ، اگه شکل زیرو ملاحظه بفرمایید آی دی مشتریا مثل رکوردهای گرید ویو زیر هم قرار گرفته با این تفاوت که داخل آن کنترل های وجود داره که جنبه نمایشی نداره بلکه میتونی عملیاتی از قبیل کانکت شدن و سایر موارد رو انجام داد که میتونید در شکل زیر مشاهده کنید میخواستم بدونم آیا واقعا این گرید ویو هستش یا یه پنله یا یه کنترل دیگه س اگه من بخام اطلاعات مشریامو به این شکل نمایش بدم باید از چه کنترلی استفاده کنم دوستان تو این از چه کنترل هایی استفاده شده که بسیار سریع اطلاعات میلیون ها مشتری رو لیست خواهد کرد

میلیون که سهله، اون مثالی که در پست دوم گذاشته بودم رو اگه ببینید 9223372036854775807 تا سطر رو بدون وقفه اسکرول می کنه.
هر کنترلی که اجازه نمایش داده از منبع مجازی رو بده (مثل قابلیت Virtual Mode در DataGridView) میتونه میلیون ها سطر رو به سادگی مدیریت کنه.
هر کنترلی هم که اجازه رسم اختصاصی (Owner Draw) رو بده (مثل DataGridView.CellPainting) میتونه هر نمایشی داشته باشه.
مثلا این مثال رو ببینید :
نقل قول: مشکل تایمر در لیست ویو (https://barnamenevis.org/showthread.php?560294-%D9%85%D8%B4%DA%A9%D9%84-%D8%AA%D8%A7%DB%8C%D9%85%D8%B1-%D8%AF%D8%B1-%D9%84%DB%8C%D8%B3%D8%AA-%D9%88%DB%8C%D9%88&p=2429234&viewfull=1#post2429234)
151477
اون دکمه ها Button نیستند، چون اصلا ListView برای قرار دادن دکمه داخلش طراحی نشده که بخواهیم کنترل دکمه داخلش قرار بدهیم.
فقط با کد نویسی دکمه داخلش رسم می کنیم، کلیک اش هم کار می کنه، با Hover ماوس ظاهرش هم عوض میشه و ... ولی چون با کد نویسی اینکار رو می کنیم، نه اینکه از اول ListView بتونه دکمه نشون بده.
یا مثلا این نمونه رو ببینید :
نقل قول: بدست آوردن کد اسکی کاراکترهای کلمات فارسی بصورت یونیکد (https://barnamenevis.org/showthread.php?558763-بدست-آوردن-کد-اسکی-کاراکترهای-کلمات-فارسی-بصورت-یونیکد)
151040
رسم ComboBox و ListBox تغییر کرده تا Glyph کاراکتر ها رو با یک کادر دور شون نشون بده. ListBox ئه ولی دیگه ظاهرش شباهتی به ListBox عادی نداره.
یا مثلا این برنامه :
نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان
(https://barnamenevis.org/showthread.php?558733-%D8%B3%D9%88%D8%A7%D9%84-%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-%DB%8C-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%DA%86%D9%86%D8%AF-%D9%86%D8%AE%DB%8C-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%86%D9%86%D8%AF-%D9%87%D8%B3%D8%AA%D9%87-%D8%A8%D8%B5%D9%88%D8%B1%D8%AA-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86&p=2424868&viewfull=1#post2424868)151028
اون کادر بزرگ فقط یک PictureBox ساده است، کنترل Diagram و ProgressBar ای در کار نیست.
منظورم از این مثال ها اینه که از مشخصات ظاهری یک کنترل مثل ListView و ListBox و ... روی قابلیت هاش قضاوت نکنید، ممکنه یک ظاهر پیچیده و با جزئیات پشتش یک کنترل پیش پا افتاده معمولی باشه.

arastoahmadi
چهارشنبه 24 اردیبهشت 1399, 09:54 صبح
ممنون از پاسختون دوست عزیز

مثال هایی خیلی خیلی عالی و جالبی بود بسیار متشکرم از تون فقط برای صفحه بندیش نمیدونم چکار باید بکنم و مطلب بعدی اینکه میخام زمانی که کاربر روی شماره موضوعات کلیک کرد رنگ اون شماره موضوع تغییر کنه مثلا الان که خاکستریه میخام زمانی که کلیک کرد رنگش قرمز باشه فقط میخام رنگ شماره موضوعات تغییر پیدا کنه یعنی خود رنگ متن موضوعات همونجوری باقی بمونه