دوست من، آخر نگفتی چیزی از User Control می دونی یا نه. دیگه تقصیر خودته.
همونطور که گفتم روش User Control خیلی بهتره چون روش تولید فرم جدید چند تا مشکل داره، یکیش اینه که از زیبایی کارت کم میکنه، راستش حال ندارم توضیح بدم چه مشکلاتی داره.
خوب روش User Control (البته کد هایی رو که جناب The_King)) نوشتند رو توضیح میدم
اول از همه مطابق شکل 1 به هر تعداد پنجره نیاز دارید، User Control ایجاد کنید. (شکل 1 و 2 تو پیوست هست)
با دو بار کلیک روی هر User Control می توانید وارد محیط طراحی آن بشوید (مطابق شکل 2)
هر User Control به عنوان یک فرم عمل میکنه، پس بسته به اون چیزی که می خوای تو فرم نشون داده بشه، هر کنترلی (دگمه، عکس، TextBox و ...) می خوای توش بچین. می تونی سایزش رو بزرگ کنی و ..
(البته اگه تا اینجا بعضی چیزا رو متوجه نمی شی، فعلا بی خیال این فرم و یوزر کنترل شو و برو اون کتابی که بهت معرفی کردم بخون)
الان باید محتوی تمام User Control هات کامل شده باشه.
خوب الان باید روی Form1.cs که توی پنجره ی solution Explorer هست دوبار کلیک کنی (تو شکل 2 میتونی Form1.cs رو ببینی)
توی پنجره طراحی فرم دو تا دگمه بساز یکی برای Next ویکی هم برای Back و یه کنترل دیگه (در اینجا از group Box استفاده شده) اضافه بکن، چرا این کنترل (GroupBox) اضافه شده چون میخوایم با زدن next یا Back این کنترل حذف بشه و بجای اون User Control هایی که قبلا ساختیم نمایش داده بشه.
خوب دگمه F7 رو فشار بده تا وارد محیط کد نویسی فرم1 بشی.
اول یه متغیر به نام i تولید میکنیم . برای چی؟ تا بازدن next یکی به i اضافه و با زدن Back یکی ازش کم کنیم. خوب برای چی کم و زیادش کنیم؟ تا یه جا تعریف کنیم اگه i صفر بود، UserControl1 و اگه i برابر 1 بود UserControl2 و .... رو نشون بده.
توی خط 33 برنامه ای گه جناب The King گذاشتن یه تابع نوشته شده. من جای اون تابع رو تو فایلی که پیوست کردم، آوردم اون اولا تو خط 20 ، اسم تابع ShowPage هست.
کار تابع چیه؟ اگه قراره یه سری کد عیناً چند جای برنامه تکرار بشه، بجای تکرار اون کد ها تو چند جای بر نامه، میایم یه بار اون کدها رو تو یه تابع مینویسم و هر وقت به اون کدها نیاز داشتیم بجای اون چندین خط، فقط یه خط مینویسیم، حالا تو اون یه خط چی مینویسیم؟ مینویسیم کدهای درون تابع رو اجرا کن.
خوب حالا تو این تابع چی نوشته شده؟ باهم ببینیم
کد:
[FONT=Tahoma][SIZE=2] private void ShowPage(int i)[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] {[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] Text = "Form" + (i + 1).ToString();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] groupBox1.Controls.Clear();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] Control c;[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] switch (i)[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] {[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] case 0:[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] c = new UserControl1();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] break;[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] case 1:[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] c = new UserControl2();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] break;[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] case 2:[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] c = new UserControl3();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] break;[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] default:[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] c = new UserControl4();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] break;[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] }[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] groupBox1.Controls.Add(c);[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] }[/SIZE][/FONT]
اول بگم که قرار شد با کلیک روی دگمه های next و Back مقدار i تغییر کنه و بعد مقدار i به تابع ShowPage ارسال بشه تا برحسب مقداره i صفحه مورد نظر نمایش داده بشه.
تابع به صورت زیر تعریف شده و مقدار i رو میگیره (البته می تونست مقدار i رو هم نگیره ولی خوب بگذریم)
کد:
private void ShowPage(int i)
تو خط اول دستورات نوشته
کد:
Text = "Form" + (i + 1).ToString();
خصوصیت Text مربوط به Form رو تغییر میده، حالا این یعنی چی؟ یعنی بالای پنجره مینویسه الان کدوم UserControl در حال نمایشه (البته این کار رو با مقدار i انجام میده)
هر عبارتی بین “ ” نوشته بشه عیناً تو خروجی چاپ میشه و مقدار i چون از نوع int هست باید به String تبدیل بشه تا بتونیم نمایشش بدیم و i+1 شده، چرا؟ چون به ازای UserControl1 ، i=0 نمایش داده میشه پس چون میخایم تو خروجی چاپ بشه form1 پس i رو بعلاوه یک میکنیم و گرنه چاپ میشه form0
تو خط بعدی نوشته
کد:
groupBox1.Controls.Clear();
Control c;
تو خط اولش، اون groupBox که تو Form1 ساخته بودیم تا UserControl ها رو جایگزینش کنیم. پاک می کنیم.
اینجا یه متغییر دیگه مثل i تعریف کرده، ولی از نوع Control نه int، و اسمش رو گذاشته c.
ولی به c مقدار اولیه داده نشده (اما به i یه مقدار اولیه داده بودیم، داخل i صفر رو قرار داده بودیم)
حالا باید به c یه مقدار بدیم .
چی باید توی c بذاریم؟ یکی از اون UserControl هایی که ساخته بودیم
چرا؟ آخه باید c رو جایگزین اون GroupBox کنیم تا نمایش داده بشه
حالا کدوم UserControl رو تو c بذاریم؟ بسته به i باید تصمیم بگریری که نوبت نمایش کدوم UserControl هست.
پس یه دستور switch/case برای مقدار دهی c (با توجه به مقدار i ) مینویسیم.
کد:
[FONT=Tahoma][SIZE=2] switch (i)[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] {[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] case 0:[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] c = new UserControl1();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] break;[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] case 1:[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] c = new UserControl2();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] break;[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] case 2:[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] c = new UserControl3();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] break;[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] default:[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] c = new UserControl4();[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] break;[/SIZE][/FONT]
[FONT=Tahoma][SIZE=2] }[/SIZE][/FONT]
و در آخر c رو جای اون GroupBox نمایش میدیم.
-------------------------
اولین UserControl که باید نشون داده بشه، همون اول که برنامه رو اجرا کردیم باید نشون داده بشه. پس باید توی رخداد Form Load، اون تابع ShowPage فراخانی بشه، و چون UserControl1 ، i=0 نشون داده میشه.
اگه نمی دونی رخداد چیه.... خوب نگاه کن Shift+F7 رو بزن تا وارد فضای طراحی بشی و روی یه فضای خالی از فرم (نه رو Button و نه رو GroupBox) دوبار کلیک کن تا وارد فضای کد بشی و رخداد Form Load ایجاد بشه و تابع رو توی این رخداد فرا خوانی کن.
کد:
private void Form1_Load(object sender, EventArgs e)
کد:
[FONT=Tahoma][SIZE=2]
{
ShowPage(i);
}[/SIZE][/FONT]
برای رخداد های Button ها هم مثل بالا که گفتم Shift+F7 رو بزن تا وارد فضای طراحی بشی و روی Button مورد نظر دوبار کلیک کن تا وارد رخداد Click بشی و کد های مربوطه رو توشون بنویسی فکر نکنم دیگه مشکلی تو این کدها داشته باشی فقط این دستور رو هم بگم که
کد:
button1.Enabled = (i < 3);
button2.Enabled = (i > 0);
اگه جلوی دستور button1.Enable عبارت true تایپ بشه دگمه فعاله و اگه false تایپ بشه دگمه غیر فعال میشه. بجای تایپ این دو کلمه می تونیم یه عبارت شرطی بنویسیم، که اگه عبارت برقرار بود انگار نوشتیم true و اگه عبارت شرطی برقرار نبود انگار نوشتیم false.
البته میشه بجای اینا از if هم استفاده کرد به عنوان مثال بجای button1.Enable=(i<3) میشه نوشت
کد:
[FONT=Tahoma][SIZE=2] if (i < 3)
button1.Enabled = true;
else
button1.Enabled = false;
[/SIZE][/FONT]
دیگه هر کدی رو نفهمیدی، یه پروژه جدید باز کن و امتحانش کن.
دیگه ساده تر از این نمی تونم توضیح بدم.
موفق باشی