PDA

View Full Version : سوال: اضافه كردن چند كليد با حلقه for



8411172410
چهارشنبه 23 دی 1388, 13:22 عصر
من با حلقه for ميخوام به برنامه كنترل اضافه كنم اما فقط يه دونه اضافه ميشه.چرا؟[

for (int i=1; i <5; i++)
{Button page = new Button();
page.Location = new System.Drawing.Point(15, 47);
this.Controls.Add(page);

mehdi.mousavi
چهارشنبه 23 دی 1388, 13:29 عصر
من با حلقه for میخوام به برنامه کنترل اضافه کنم اما فقط یه دونه اضافه میشه.چرا؟[

for (int i=1; i <5; i++)
{Button page = new Button();
page.Location = new System.Drawing.Point(15, 47);
this.Controls.Add(page);


سلام.
خیر. 4 تا اضافه میشه، اما چون همشون رو در یک Location قرار میدید، متوجه این مساله نمیشید (در واقع کلیدها رو دارید روی هم قرار میدید).

موفق باشید.

پاورقی: اگر این button هستش، چرا اسم متغیر رو گذاشتید page؟ میخواهید برنامه نویس بعدی رو گمراه کنید؟ :متعجب:

saed2006
چهارشنبه 23 دی 1388, 13:31 عصر
به تعدادی که میخوای اضافه میشه اما خاصیت location رو تنظیم نمیکنی
همش روی هم می افته

mehdi.mousavi
چهارشنبه 23 دی 1388, 13:50 عصر
سلام.
این بار چندم هستش که این اتفاق میفته، میخواستم بدونم پاسخ شما (slashslash2009 و saed2006) چه چیز جدیدی به پاسخ اول در Thread اضافه کرده؟

موفق باشید.

saed2006
چهارشنبه 23 دی 1388, 14:10 عصر
سلام.
این بار چندم هستش که این اتفاق میفته، میخواستم بدونم پاسخ شما (slashslash2009 و saed2006) چه چیز جدیدی به پاسخ اول در Thread اضافه کرده؟

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

mehdi.mousavi
چهارشنبه 23 دی 1388, 14:23 عصر
اگر کمی دقت کرده بودید می دیدید که اختلاف زمانی ارسال پست من با شما تقریبا دو دقیقه هست به عبارتی هنگامی که من پستم رو تایپ میکردم شما دکمه ارسال رو زدین سعی کنید به چیزای مهمتر فکر کنید موفق باشید

بارها همین اتفاق برای من افتاده، و وقتی دیدم پست قبلی جواب سوال رو داده، پست خودم رو (که چیزی افزون بر پاسخ اولیه نداشته) حذف کرده ام. من برای مسائل اخلاقی اینجا نیستم، اما هر از گاهی باید برخی مطالب رو گوشزد کرد.

Saeed.Masoumi
چهارشنبه 23 دی 1388, 17:46 عصر
سلام
آقای موسوی یک سوال.
آیا بهتر نیست در هنگام ایجاد باتن ها خاصیت Name آنها را هم مقداری دهی کنند؟


B.Name = "button" + i.ToString();

mehdi.mousavi
پنج شنبه 24 دی 1388, 16:22 عصر
سلام آقای موسوی یک سوال. آیا بهتر نیست در هنگام ایجاد باتن ها خاصیت Name آنها را هم مقداری دهی کنند؟

سلام.
اهمیتی نداره... مگه قراره استفاده خاصی از Name اون کنترل کنید؟ قاعدتا خیر! Reference به اون Object و Event هایی که اون Object میتونه Fire کنه هستش که باید برای شما اهمیت داشته باشه.

البته، من هرگز خودم به این نیاز نرسیده ام که بخوام توی یک Loop، مشتی Button ایجاد کنم و اونها رو روی صفحه قرار بدم. عموما چنین نیازهایی رو باید هشدار باشی برای عدم صحیح طراحی یک کنترل تلقی کرد. گهگاه، من از این جور کدها میبینم که عموما در اونها، برنامه نویس جای اینکه بشینه یک کنترل خاصی رو خودش پیاده سازی کنه (با استفاده از Building Block های Base)، به اشتباه اونو یک Composite Control قلمداد میکنه و بخاطر همین انتخاب نادرست، بعدا انواع و اقسام سوالات براش پیش میاد که هر کدوم رو با یک پاسخ نادرست تر جواب میده و در نهایت یه Spaghetti Code تحویل جامعه میده.

موفق باشید.

slashslash2009
پنج شنبه 24 دی 1388, 18:27 عصر
خاصیت name نیاز نیست اما خاصیت text باید مقدار دهی بشه حتما.
چه طوری برای هر کلید یک رویداد click درست میکنی:چشمک:

FastCode
پنج شنبه 24 دی 1388, 20:01 عصر
خاصیت name نیاز نیست اما خاصیت text باید مقدار دهی بشه حتما.
چه طوری برای هر کلید یک رویداد click درست میکنی:چشمک:

من توی برنامه های خودم این کارو با تگ و دلگیت انجام میدم.

FastCode
پنج شنبه 24 دی 1388, 20:07 عصر
سلام.
اهمیتی نداره... مگه قراره استفاده خاصی از Name اون کنترل کنید؟ قاعدتا خیر! Reference به اون Object و Event هایی که اون Object میتونه Fire کنه هستش که باید برای شما اهمیت داشته باشه.

البته، من هرگز خودم به این نیاز نرسیده ام که بخوام توی یک Loop، مشتی Button ایجاد کنم و اونها رو روی صفحه قرار بدم. عموما چنین نیازهایی رو باید هشدار باشی برای عدم صحیح طراحی یک کنترل تلقی کرد. گهگاه، من از این جور کدها میبینم که عموما در اونها، برنامه نویس جای اینکه بشینه یک کنترل خاصی رو خودش پیاده سازی کنه (با استفاده از Building Block های Base)، به اشتباه اونو یک Composite Control قلمداد میکنه و بخاطر همین انتخاب نادرست، بعدا انواع و اقسام سوالات براش پیش میاد که هر کدوم رو با یک پاسخ نادرست تر جواب میده و در نهایت یه Spaghetti Code تحویل جامعه میده.

موفق باشید.
کاملا" مخالفم.
برنامه ی من opensource نیست ولی اسپاگتی ک د:عصبانی::عصبانی: :عصبانی: :عصبانی: :عصبانی: هم نیست.
یک فرم با کلی امکانات:

using System;
using System.Drawing;
using System.Windows.Forms;
namespace Esfand.Gozareshat.List_Masir
{
public partial class Form_Print : System.Windows.Forms.Form, Esfand.ProfileManagement.FormEx
{
System.Collections.Generic.List<Button> Buttons;
Button CButton;
public Form_Print()
{
InitializeComponent();
dataGridView1.AutoGenerateColumns = false;
Buttons = new System.Collections.Generic.List<Button>();
combo1.DisplayMember = "Name";
combo1.ValueMember = "Code";
combo1.DataSource = Esfand.Data.DataClasses.Masir.GetSharedData();
Buttons = new System.Collections.Generic.List<Button>();
if (flowLayoutPanel1.Controls.Count > 2) flowLayoutPanel1.Controls.RemoveAt(2);
}
private void combo1_SelectedIndexChanged(object sender, EventArgs e) { if (combo1.SelectedIndex != -1) AddButton(combo1.SelectedValue.ToString()); }
private void txtbox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { AddButton(txtbox1.Text); txtbox1.Text = ""; } }
private void AddButton(string p)
{
Button B = new Button();
B.Size = new Size(60, 24);
B.Text = p;
B.Tag = p;
B.Click += B_Click;
flowLayoutPanel1.Controls.Add(B);
Buttons.Add(B);
if (Buttons.Count > 30) Buttons.RemoveAt(0);
if (flowLayoutPanel1.Controls.Count > 32) flowLayoutPanel1.Controls.RemoveAt(2);
}
void B_Click(object sender, EventArgs e) { CButton = (Button)sender; ShowCurrent(); gm.GridOptions.PrintOptions.Parameters = new string[1] { CButton.Text }; }
private void ShowCurrent()
{
dataGridView1.DataSource = new BindingSource(Esfand.Data.DataClasses.Masir.PKFind (Esfand.Interaction.Val_long(CButton.Tag)), "ChildMoshtarys");
if (gm == null) gm = new Esfand.ProfileManagement.GridManager(dataGridView1 , this.FormOptions, "Main", this);
}
private void button1_Click(object sender, EventArgs e) { foreach (Button B in Buttons) Print(B); }
private void button2_Click(object sender, EventArgs e) { Print(CButton); Buttons.Remove(CButton); flowLayoutPanel1.Controls.Remove(CButton); }
private void Print(Button B) { if (B != CButton) { CButton = B; ShowCurrent(); } Esfand.ProfileManagement.GridManager.PrintCurrentG rid(); }
ProfileManagement.GridManager gm;
Esfand.ProfileManagement.FormOptions formOptions; public Esfand.ProfileManagement.FormOptions FormOptions { get { if (formOptions == null)formOptions = ((Esfand.ProfileManagement.ICollection<Esfand.ProfileManagement.FormOptions>)Esfand.ProfileManagement.AccountsList.Current.Cur rentAccount).Find(this.GetType().FullName); return formOptions; } }
System.Windows.Forms.DataGridView[] grids; System.Windows.Forms.DataGridView[] Esfand.ProfileManagement.FormEx.Grids { get { if (grids == null) grids = new DataGridView[1] { dataGridView1 }; return grids; } }
private void Form_Print_FormClosing(object sender, FormClosingEventArgs e) { if (gm != null) gm.Abort(); }
}
}

slashslash2009
پنج شنبه 24 دی 1388, 20:13 عصر
آره با تگ هم میشه کار کرد شاید بهتر از text هم باشه

mehdi.mousavi
جمعه 25 دی 1388, 02:05 صبح
کاملا" مخالفم. برنامه ی من opensource نیست ولی اسپاگتی کد هم نیست. یک فرم با کلی امکانات:


using System;
using System.Drawing;
using System.Windows.Forms;
namespace Esfand.Gozareshat.List_Masir
{
public partial class Form_Print : System.Windows.Forms.Form, Esfand.ProfileManagement.FormEx
{
System.Collections.Generic.List<Button> Buttons;
Button CButton;
public Form_Print()
{
InitializeComponent();
dataGridView1.AutoGenerateColumns = false;
Buttons = new System.Collections.Generic.List<Button>();
combo1.DisplayMember = "Name";
combo1.ValueMember = "Code";
combo1.DataSource = Esfand.Data.DataClasses.Masir.GetSharedData();
Buttons = new System.Collections.Generic.List<Button>();
if (flowLayoutPanel1.Controls.Count > 2) flowLayoutPanel1.Controls.RemoveAt(2);
}
private void combo1_SelectedIndexChanged(object sender, EventArgs e) { if (combo1.SelectedIndex != -1) AddButton(combo1.SelectedValue.ToString()); }
private void txtbox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { AddButton(txtbox1.Text); txtbox1.Text = ""; } }
private void AddButton(string p)
{
Button B = new Button();
B.Size = new Size(60, 24);
B.Text = p;
B.Tag = p;
B.Click += B_Click;
flowLayoutPanel1.Controls.Add(B);
Buttons.Add(B);
if (Buttons.Count > 30) Buttons.RemoveAt(0);
if (flowLayoutPanel1.Controls.Count > 32) flowLayoutPanel1.Controls.RemoveAt(2);
}
void B_Click(object sender, EventArgs e) { CButton = (Button)sender; ShowCurrent(); gm.GridOptions.PrintOptions.Parameters = new string[1] { CButton.Text }; }
private void ShowCurrent()
{
dataGridView1.DataSource = new BindingSource(Esfand.Data.DataClasses.Masir.PKFind (Esfand.Interaction.Val_long(CButton.Tag)), "ChildMoshtarys");
if (gm == null) gm = new Esfand.ProfileManagement.GridManager(dataGridView1 , this.FormOptions, "Main", this);
}
private void button1_Click(object sender, EventArgs e) { foreach (Button B in Buttons) Print(B); }
private void button2_Click(object sender, EventArgs e) { Print(CButton); Buttons.Remove(CButton); flowLayoutPanel1.Controls.Remove(CButton); }
private void Print(Button B) { if (B != CButton) { CButton = B; ShowCurrent(); } Esfand.ProfileManagement.GridManager.PrintCurrentG rid(); }
ProfileManagement.GridManager gm;
Esfand.ProfileManagement.FormOptions formOptions; public Esfand.ProfileManagement.FormOptions FormOptions { get { if (formOptions == null)formOptions = ((Esfand.ProfileManagement.ICollection<Esfand.ProfileManagement.FormOptions>)Esfand.ProfileManagement.AccountsList.Current.Cur rentAccount).Find(this.GetType().FullName); return formOptions; } }
System.Windows.Forms.DataGridView[] grids; System.Windows.Forms.DataGridView[] Esfand.ProfileManagement.FormEx.Grids { get { if (grids == null) grids = new DataGridView[1] { dataGridView1 }; return grids; } }
private void Form_Print_FormClosing(object sender, FormClosingEventArgs e) { if (gm != null) gm.Abort(); }
}
}

سلام.
قبل از اینکه بهتون پاسخ بدم یادآور میشم که You are not your code! حالا بریم سراغ کد شما. شما به این کد میگید "کد"؟؟؟ حتما دارید شوخی می کنید با من. اسم گذاریها که افتضاحه، flowLayoutPanel1، B، combo1، dataGridView1 و ... فکر کردید Spaghetti Code چیه؟ فقط Call کردنهای متوالی و دسترسی به متغیر کلاسهای دیگه، بدون هیچ ضابطه ای؟ خیر! این اسم گذاریها نشون میده که کد شما، کاملا Spaghetti هستش.

مساله بعدی، کاری هستش که در txtbox1_KeyDown انجام داده اید. شما اینجا نگاه می کنید آیا کلید Enter زده شده یا خیر و سپس کاری رو انجام میدید. اگر قرار باشه که جاهای دیگه از این نوع TextBox استفاده کنید، باز هم می خواهید این تکه کد رو که "آیا کلید زده شده Enter بوده یا خیر"، رو توی KeyDown اون TextBox بنویسید؟ پس Code Reusing چی میشه؟ Subclass کردن رو برای چی درآوردن؟؟؟ اینم یه دلیل دیگه واسه اسپاگتی بودن کد.

مساله بعدی... ctor کلاس رو نگاه کنید. چرا دوبار این خط رو نوشته اید؟

Buttons = new System.Collections.Generic.List<Button>

ترسیدید دفعه اول new نشه؟ (دارم شوخی میکنم اما جدا چرا دوبار تکرار شده؟؟؟)

شما به این میگید یک فرم با کلی امکانات؟؟؟ پس Object Oriented چی میشه؟ چرا یه کلاس MyBaseForm ندارید که کارهای پایه رو که همه فرمها بهش نیاز دارن توش انجام بدید و سپس فرمهای دیگه از اون Derive بشن؟ فقط به صرف Implement کردن Esfand.ProfileManagement.FormEx روی کلاس خودتون، فکر کرده اید کار بزرگی انجام داده اید؟؟؟

به این خط از کد نگاه کنید:

combo1.DisplayMember = "Name";

داره داد میزنه که Refactor باید بشه. اگر فردا تو Middle Layer اتون، ستون Name رو به WhateverFieldName تغییر بدید، باید دونه به دونه کلیه String های Name رو تو Source پیا کنید و دستی اونو به WhateverFieldName تغییر بدید. این یعنی اسپاگتی...

شما جای اینکه OnFormClosing رو override کنید، خودتون رو برای گرفتن FormClosing Event دارید Subscribe می کنید؟؟؟

برنامه شما ممکنه Open Source نباشه و "گمان" کنید که UI زیبایی داره، اما بدون شک Spaghetti Code هستش...

موفق باشید.

FastCode
جمعه 25 دی 1388, 07:02 صبح
من فکر میکنم اسپاگتی یعنی این که 1000 خط دستور توی یک فرم باشه و هیچ کار خاصی انجام نده , و بجای refactor کردن کد اضافی بنویسن.
صد در صد برای MyBaseForm دلیل داشتم.
در ضمن همین جا اعلان میدارم که UI زشتی داره چون روش کار نکردم و فقط به کد چسبیدم.
در ضمن Buttons = new System.Collections.Generic.List<Button>(); رو ندیده بودم.(از اسمها هم مشخص که این فرم کار 5 دقیقست. و من میخواستم کوچکترین مثالی رو که دارم بزارم اینجا تا سوال کننده راحتتر متوجه بشوند)
می خواستم بدونم که شما تا حالا اسپاگتی کد واقعی دیدید؟از اونایی که هر فرم 20000 خط؟

csharpprogramer88
جمعه 25 دی 1388, 09:03 صبح
من با حلقه for میخوام به برنامه کنترل اضافه کنم اما فقط یه دونه اضافه میشه.چرا؟[

for (int i=1; i <5; i++)
{Button page = new Button();
page.Location = new System.Drawing.Point(15, 47);
this.Controls.Add(page);

ببين اين كد به كارت مياد من با اين كد يه سلكت انجام مي دم و نتيجه را به تكست باتن مي ريزم


con.Open();
cmd = new SqlCommand("select distinct (city) from honar", con);
dr = cmd.ExecuteReader();

int i = 0;
while (dr.Read())
{
i = i + 1;
btn = new Button();
btn.Size = new Size(70, 70);
btn.Location = new Point((i % 7) * 70, (i / 7) * 70);
btn.Text = (dr[0].ToString());
this.Controls.Add(btn);
}
con.Close();

mehdi.mousavi
جمعه 25 دی 1388, 09:48 صبح
من فکر میکنم اسپاگتی یعنی این که 1000 خط دستور توی یک فرم باشه و هیچ کار خاصی انجام نده , و بجای refactor کردن کد اضافی بنویسن. صد در صد برای MyBaseForm دلیل داشتم. در ضمن همین جا اعلان میدارم که UI زشتی داره چون روش کار نکردم و فقط به کد چسبیدم. در ضمن Buttons = new System.Collections.Generic.List<Button>(); رو ندیده بودم.(از اسمها هم مشخص که این فرم کار 5 دقیقست. و من میخواستم کوچکترین مثالی رو که دارم بزارم اینجا تا سوال کننده راحتتر متوجه بشوند) می خواستم بدونم که شما تا حالا اسپاگتی کد واقعی دیدید؟ از اونایی که هر فرم 20000 خط؟

سلام.
تعدا خطوط برنامه در یک کلاس، لزوما ربطی به Spaghetti بودن یا نبودن نداره. در وهله اول، این عبارت به هر کد Unstructured ای اطلاق میشه. در مقابل، سیستمهای Structured رو داریم که وظائفشون رو از طریق "اینترفیسهای خوب تعریف شده" انجام میدن.

در مرحله بعدی، کدهایی رو میگن اسپاگتی که بی رویه شاخه اجرایی کد رو تغییر میدن! مثلا کدهایی که if زیاد دارن، goto های زیاد دارند و هر آنچیزی که باعث میشه روند اجرایی شاخه اصلی، مدام تغییر کنه. (من منظورم این نبود، وقتی گفتم کد شما اسپاگتی کد هستش. منظورم اون اولی بود. یعنی Structured نیست!)

فقط همین.
موفق باشید.

saed2006
جمعه 25 دی 1388, 10:40 صبح
چرا یه کلاس MyBaseForm ندارید که کارهای پایه رو که همه فرمها بهش نیاز دارن توش انجام بدید و سپس فرمهای دیگه از اون Derive بشن؟
یه سوال:
چه چیزهایی رو باید درون MyBaseForm بزاریم
لطفا کمی در این مورد توضیح بدین

FastCode
جمعه 25 دی 1388, 10:46 صبح
دستورات کنترلی برای بستن و باز کردن فرم.
تنظیمات style font و رنگ.
افزودن امکانات عمومی مثل contextmenu.
...

slashslash2009
جمعه 25 دی 1388, 11:17 صبح
بعضی از دوستان برنامه هاشونو خیلی پیچوندن کاربر نمیتونه کار کنه اینجوری که