PDA

View Full Version : سوال: تغییر مکان 30 تا چک باکس با حلقه



دلتنگ اسمان
پنج شنبه 04 مهر 1392, 16:26 عصر
سلام.
30 تا چک باکس دارم که میخوام با یک حلقه for هر چک باکس مکانش تغییر کنه . یعنی هر چک باکس در مکان چک باکس بعدی قرار بگیره. به عبارتی همشون شیفت داده بشن به جلو. ممنون از راهنمایتون

khokhan
پنج شنبه 04 مهر 1392, 16:46 عصر
سلام.
30 تا چک باکس دارم که میخوام با یک حلقه for هر چک باکس مکانش تغییر کنه . یعنی هر چک باکس در مکان چک باکس بعدی قرار بگیره. به عبارتی همشون شیفت داده بشن به جلو. ممنون از راهنمایتون
.................................................. ......................:افسرده:

private void Form1_Load(object sender, EventArgs e)
{
var faults = new CheckBox[30];

Point startPoint = new Point(30, 5);

for (int i = 0; i < faults.Length; i++)
{
Controls.Add(new CheckBox()
{
Location = new Point(startPoint.X, 20 * i + startPoint.Y),
Text = (i + 1).ToString()
});
}
}

دلتنگ اسمان
پنج شنبه 04 مهر 1392, 16:57 عصر
ممنون از توجهتون اما من 30تا چک باکس رو نمیخوام ایجاد کنم بلکه اونها رو دارم .فقط میخوام هر چک باکس در مکان چکس باکس بعدی قرار بگیره.

chek_1.Location = new Point(chek_2.Location.X, chek_2.Location.Y);
chek_2.Location = new Point(chek_3.Location.X, chek_3.Location.Y);
chek_3.Location = new Point(chek_4.Location.X, chek_4.Location.Y);
chek_4.Location = new Point(chek_5.Location.X, chek_5.Location.Y);
chek_5.Location = new Point(chek_6.Location.X, chek_6.Location.Y);
کد نوشته شده درست عمل میکنه اما نمیخوام 30 تا چک باکس رو اینجوری بنویسم میخوام داخل حلقه باشه.

Kubuntu
پنج شنبه 04 مهر 1392, 17:14 عصر
کدهای داخل رویداد یک button

foreach (Control c in GetAllControls<CheckBox>(this))
{
//دستورات پوینت
}

کافیه نسبت به c لوکیشنی که می خوای رو بدی. c چک باکس موجود در فرم شماست. اگه چک باکسها در panel است جای this اسم پنل رو بذارید

private List<T> GetAllControls<T>(Control ctl) where T : Control
{
var l = new List<T>();
GetAllControls(ctl, l);
return l;
}
private void GetAllControls<T>(Control ctl, List<T> l) where T : Control
{
foreach (Control sctl in ctl.Controls)
{
if (sctl is T)
l.Add(sctl as T);
GetAllControls(sctl, l);
}
}

دلتنگ اسمان
پنج شنبه 04 مهر 1392, 17:26 عصر
int i = 1;
foreach(CheckBox c in this.groupBox1.Controls)
{
if (c.Name == "chek_" + i)
{
foreach (CheckBox c2 in this.groupBox1.Controls)
{
if (c2.Name == "chek_" + i + 1)
{
c.Location = new Point(c2.Location.X, c2.Location.Y);
}
}
}
}

حقیقتش از کدهای شما زیاد سر در نیاوردم. خودم این کد رو نوشتم اما کامپایلر خطا میگیره به foreach (CheckBox اولی خطا میده. نمیدونم شاید بد تعریف کردم.

Kubuntu
پنج شنبه 04 مهر 1392, 17:35 عصر
اگه از راه شما می شد به نتیجه رسید همین رو می ذاشتم.
شما همه کدها رو کپی پیست کن. نیاز به دستور شرطی هم نیس. راستش ضرورتش رو متوجه نشدم. در هر سری c معادل یکی از چک باکس هاست. لطفا TabIndex رو هم مرتب کن.
داخل حلقه کافیه بنویسی

c.Location = new Point(c.Location.X+5, c.Location.Y);

Kubuntu
پنج شنبه 04 مهر 1392, 19:25 عصر
هر خطایی داشت بهم بگو. تنها راه دسترسی به کنترلهای یک فرم همونی هست ک گفتم. اگه راه ساده تری هست خوشحال می شم دوستان بیان کنن

دلتنگ اسمان
پنج شنبه 04 مهر 1392, 19:53 عصر
کد رو به اینصورت نوشتم خطا نمیده و اجرا هم میشه اما چکس باکس ها رو فرم نشون داده نمیشن!!!


int i = 30;
foreach (Control c in this.Controls)
{
if (c.Name == "chek_" + i)
{
foreach (Control c2 in this.Controls)
{
if (c2.Name == "chek_" +( i + 1))
{
c.Location = new Point(c2.Location.X, c2.Location.Y);
i--;
break;
}
}

}

}

Kubuntu
پنج شنبه 04 مهر 1392, 20:10 عصر
اصلن من با شما کاری ندارم.... شما همش ساز خودت رو می زنی!
یه بار همه کدهای منو کپی پیست کن.... البته اگه دوست داری از شر این سوالت خلاص بشی

موفق باشی

دلتنگ اسمان
پنج شنبه 04 مهر 1392, 20:10 عصر
بالاخره یافتم :

int i = 1;
while (i < 32)
{

foreach (Control c in this.Controls)
{
if (c.Name == "chek_" + i)
{
foreach (Control c2 in this.Controls)
{
if (i == 31)
{
c.Location = new Point((chek_30.Location.X) - 50, chek_30.Location.Y);
i++;
break;
}
else if (c2.Name == "chek_" + (i + 1))
{
c.Location = new Point(c2.Location.X, c2.Location.Y);
i++;
break;
}

} // End foreach

}// End if

}//End foreach

}//Enf while

Kubuntu
جمعه 05 مهر 1392, 21:04 عصر
اگه چک باکسهای خاصی رو بخواهیم کنترل کنیم نه همه چک باکس ها رو چیکار باید کرد؟
می تونی چک باکس ها رو گروه بندی کنی از طریق پنل.
یا اینکه در تعریف name یک علامت بذاری، مثلا اول نام بعضیهاشون با N شروع بشه. بعد داخل حلقه سر Name شرط می ذاری.