سلام.
30 تا چک باکس دارم که میخوام با یک حلقه for هر چک باکس مکانش تغییر کنه . یعنی هر چک باکس در مکان چک باکس بعدی قرار بگیره. به عبارتی همشون شیفت داده بشن به جلو. ممنون از راهنمایتون
سلام.
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()
});
}
}
ممنون از توجهتون اما من 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 تا چک باکس رو اینجوری بنویسم میخوام داخل حلقه باشه.
کدهای داخل رویداد یک 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);
}
}
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 اولی خطا میده. نمیدونم شاید بد تعریف کردم.
آخرین ویرایش به وسیله دلتنگ اسمان : پنج شنبه 04 مهر 1392 در 17:42 عصر
اگه از راه شما می شد به نتیجه رسید همین رو می ذاشتم.
شما همه کدها رو کپی پیست کن. نیاز به دستور شرطی هم نیس. راستش ضرورتش رو متوجه نشدم. در هر سری c معادل یکی از چک باکس هاست. لطفا TabIndex رو هم مرتب کن.
داخل حلقه کافیه بنویسی
c.Location = new Point(c.Location.X+5, c.Location.Y);
هر خطایی داشت بهم بگو. تنها راه دسترسی به کنترلهای یک فرم همونی هست ک گفتم. اگه راه ساده تری هست خوشحال می شم دوستان بیان کنن
کد رو به اینصورت نوشتم خطا نمیده و اجرا هم میشه اما چکس باکس ها رو فرم نشون داده نمیشن!!!
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;
}
}
}
}
اصلن من با شما کاری ندارم.... شما همش ساز خودت رو می زنی!
یه بار همه کدهای منو کپی پیست کن.... البته اگه دوست داری از شر این سوالت خلاص بشی
موفق باشی
بالاخره یافتم :
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
آخرین ویرایش به وسیله دلتنگ اسمان : پنج شنبه 04 مهر 1392 در 20:20 عصر
می تونی چک باکس ها رو گروه بندی کنی از طریق پنل.اگه چک باکسهای خاصی رو بخواهیم کنترل کنیم نه همه چک باکس ها رو چیکار باید کرد؟
یا اینکه در تعریف name یک علامت بذاری، مثلا اول نام بعضیهاشون با N شروع بشه. بعد داخل حلقه سر Name شرط می ذاری.