PDA

View Full Version : گرفتن لیست کنترلها به ترتیب نام



ghasemloo
سه شنبه 11 آذر 1393, 14:47 عصر
سلام من یه حلقه دارم که با foreach نوشتم و میخوام picturebox های روی فرمم توسط اون بریزم داخل آرایه ی controlاما همونطور که میدونید foreach به صورت مرتب (صعودی ) این کنترل ها رو به من نمیده
مثلا یه بار pic60 یه بار 49 و .... همینطور درهم
خلاصه کلام این که چطور می تونم رو کنترلهای روی فرم رو براساس نامشون استخراج کنم و توآرایه بریزم

Control[] ctrl1;
private void button1_Click(object sender, EventArgs e)
{
int count = 0;

foreach (Control ctrl in Controls)
{

if (ctrl.GetType() == typeof(PictureBox))
{

ctrl1[Convert.ToInt32(ctrl.Name.Replace("pic",""))-1]=ctrl;

}
}
}

rasoolf
سه شنبه 11 آذر 1393, 15:02 عصر
ببین این لینک کمکت میکنه (http://stackoverflow.com/questions/4526025/foreach-control-cltr-in-frm-controls-in-which-order-it-takes-controls)

مهرداد صفا
سه شنبه 11 آذر 1393, 15:27 عصر
با سلام.
مجموعه کنترل ها رو ابتدا Cast کرده تا به یک IEnumerable<Control> تبدیل شود؛ سپس با OrderBy مرتب کرده و با استفاده از متود ToArray به آرایه تبدیل کنید.


Control[] myControls=this.Controls
.Cast<Control>()
.OrderBy(c=>c.Name)
.ToArray();

rasoolf
سه شنبه 11 آذر 1393, 15:50 عصر
List<TextBox> tb = new List<TextBox>();
foreach (Control item in this.Controls)
{
TextBox tb1 = item as TextBox;
if (tb1 != null) tb.Add(tb1);
}
Control[] myControls = tb.Cast<Control>().OrderBy(c => c.Name).ToArray();

ghasemloo
سه شنبه 11 آذر 1393, 16:45 عصر
به کمک شما من توستم این شرطو بنویسم ولی


foreach (Control ctrl in Controls.Cast<Control>().OrderBy(c=>c.Name))

picturebox هارو اینطور پس میده
pic1 ,pic11,pic12,pic2,pic20,pic21,pic3,pic31,pic32

mojtabamalaekeh
سه شنبه 11 آذر 1393, 16:46 عصر
مرتب سازی رشته ای اینجوریه:
pic0
pic1
pic10
pic11
pic2
pic20
.
.
.
پس اگه تعدادشون بیشتر از ده تا میشه و پیشوند همه شون ثابت pic هست یه دیکشنری بذار که کلیدش Control باشه و مقدارش int باشه.
توی کلید، خود کنترل رو بذار. توی مقدارش عدد بعد از پیشوند pic رو بذار.
حالا دیکشنری رو Sort کن :)

ghasemloo
سه شنبه 11 آذر 1393, 18:31 عصر
مرتب سازی رشته ای اینجوریه:
pic0
pic1
pic10
pic11
pic2
pic20
.
.
.
پس اگه تعدادشون بیشتر از ده تا میشه و پیشوند همه شون ثابت pic هست یه دیکشنری بذار که کلیدش Control باشه و مقدارش int باشه.
توی کلید، خود کنترل رو بذار. توی مقدارش عدد بعد از پیشوند pic رو بذار.
حالا دیکشنری رو Sort کن :)
منظورتون رو نمی فهمم اگه میشه با سورس توضیح بدید ممنون میشم :افسرده:

مهرداد صفا
سه شنبه 11 آذر 1393, 19:58 عصر
سلام.
می تونید ابتدا با استفاده از قسمت الفبایی و در مرحله بعد با استفاده از قسمت عددی، مرتب سازی رو انجام بدید:

var myControls = this.Controls.Cast<Control>()
.OrderBy(c => new string(c.Name.TakeWhile(n => !char.IsNumber(n)).ToArray()))
.ThenBy(c=> int.Parse(new string(c.Name.SkipWhile(n=> !char.IsNumber(n)).ToArray())))
.ToList();

rahnema1
سه شنبه 11 آذر 1393, 20:08 عصر
سلام این شکلی هم میشه

PictureBox[] pictures =
Controls.Cast<Control>()
.Where(C => C.GetType().Equals(typeof(PictureBox)))
.OrderBy(P => int.Parse(P.Name.Substring(3)))
.Cast<PictureBox>()
.ToArray();

mojtabamalaekeh
چهارشنبه 12 آذر 1393, 06:51 صبح
ghasemloo جان کدهای دوستان خلاصه تر از روش استفاده از دیکشنریه.
مثلا کد پست شماره 8 اگه یه خط بهش اضافه کنی تمومه:

.Where(c => c.GetType() == typeof(PictureBox))

توی خط دوم بعد از OrderBy اضافش کن. این کد خیلی جالبه چون کاملا پویاست و لازم نیست حتما اسامی در قالب «سه حرف اول pic بعد عدد» باشن.

پست شماره 9 هم جواب میده.

در نهایت اینم با استفاده از دیکشنری:

private void button4_Click(object sender, EventArgs e)
{
Dictionary<Control, int> dic = new Dictionary<Control, int>(0);
foreach (Control ctrl in Controls)
if (ctrl.GetType() == typeof(PictureBox))
if (ctrl.Name.StartsWith("pic"))
dic.Add(ctrl, Convert.ToInt32(ctrl.Name.Replace("pic", "")));

var srt = (from x in dic
orderby x.Value
select x).ToDictionary(x => x.Key);

int top = 20;
foreach (Control ctrl in srt.Keys)
{
//MessageBox.Show(ctrl.Name);
ctrl.Text = ctrl.Name;
ctrl.Location = new Point(20, top);
ctrl.BringToFront();
top += ctrl.Height + 6;
}



حلقه ی آخری هم برای تست اطمینان از مرتب بودن اشیا میاد همه رو میچینه زیر هم.