PDA

View Full Version : غیرفعال کردن همزمان پانزده Label



بیتا حکمت
سه شنبه 25 فروردین 1394, 23:06 عصر
ســلام دوستان . من میخوام که 15 لیبل رو همزمان غیرفعال کنم ، این کد جواب می ده




for (int i = 16; i <= 30; i++)
{
learlessonfrm.ActiveForm.Controls[" label" + i.ToString()].Enabled = false;
}




اما مشکل اینکه اون 15 لیبل خودشون داخل 15 تا کنترل پنل هستند . مثلا" Label16 داخل panel16 هست و ... چه تغییری باید در کد اعمال بشه ؟!

pouria_bayat
سه شنبه 25 فروردین 1394, 23:54 عصر
130347


public partial class Form1 : Form
{
Label[] lbl = new Label[15];
Panel[] p = new Panel[15];
public Form1()
{
InitializeComponent();

}

private void Create_Click(object sender, EventArgs e)
{
for (int i = 0; i < 15; i++)
{
p[i] = new Panel();
p[i].Location = new System.Drawing.Point(0, i * 50);
p[i].Size = new System.Drawing.Size(228, 50);
p[i].BackColor = Color.Gold;
p[i].Name = "Panel1";
lbl[i] = new Label();
lbl[i].AutoSize = true;
lbl[i].Text = i.ToString();
p[i].Controls.Add(lbl[i]);
Controls.Add(p[i]);
}
}

private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < 15; i++)
{
lbl[i].Enabled = false;
}
}

private void button3_Click(object sender, EventArgs e)
{
for (int i = 0; i < 15; i++)
{
lbl[i].Enabled = true;
}
}
}

بیتا حکمت
چهارشنبه 26 فروردین 1394, 00:06 صبح
130347


public partial class Form1 : Form
{
Label[] lbl = new Label[15];
Panel[] p = new Panel[15];
public Form1()
{
InitializeComponent();

}

private void Create_Click(object sender, EventArgs e)
{
for (int i = 0; i < 15; i++)
{
p[i] = new Panel();
p[i].Location = new System.Drawing.Point(0, i * 50);
p[i].Size = new System.Drawing.Size(228, 50);
p[i].BackColor = Color.Gold;
p[i].Name = "Panel1";
lbl[i] = new Label();
lbl[i].AutoSize = true;
lbl[i].Text = i.ToString();
p[i].Controls.Add(lbl[i]);
Controls.Add(p[i]);
}
}

private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < 15; i++)
{
lbl[i].Enabled = false;
}
}

private void button3_Click(object sender, EventArgs e)
{
for (int i = 0; i < 15; i++)
{
lbl[i].Enabled = true;
}
}
}


خیلی ممنونم . ولی راهی نداره همون کنترل های پنلی که که قبلا ایجاد کردم و داخلشون label گذاشتم رو استفاده کنم ؟ (منظورم اینکه همون کدی رو که خودم گذاشتم ویرایش کنم .)

pouria_bayat
چهارشنبه 26 فروردین 1394, 00:29 صبح
چرا اگر داخل Panel فقط همون 15 تا لیبل هست میتونی Enable پنل رو false کنی. یا روش زیر:


foreach (Control p in panel2.Controls)
if (p.GetType() == typeof(Label))
p.Enabled = false;

بیتا حکمت
چهارشنبه 26 فروردین 1394, 00:36 صبح
چرا اگر داخل Panel فقط همون 15 تا لیبل هست میتونی Enable پنل رو false کنی. راه دیگه ای به ذهن من نمیرسه.

نه هر لیبل داخل یک پنل هست . یعنی 15 پنل !! به هر حال بازم ممنونم . اگر جواب رو پیدا کردم اینجا می نویسم .

LastAirbender
چهارشنبه 26 فروردین 1394, 04:44 صبح
ســلام دوستان . من میخوام که 15 لیبل رو همزمان غیرفعال کنم ، این کد جواب می ده



for (int i = 16; i <= 30; i++)
{
learlessonfrm.ActiveForm.Controls[" label" + i.ToString()].Enabled = false;
}


اما مشکل اینکه اون 15 لیبل خودشون داخل 15 تا کنترل پنل هستند . مثلا" Label16 داخل panel16 هست و ... چه تغییری باید در کد اعمال بشه ؟!

سلام ،

for (int i = 16; i <= 30; i++)
{
((Label)((Panel)learlessonfrm.ActiveForm.Controls["panel" + i.ToString()]).Controls["label" + i.ToString()]).Enabled = false;
}

Javad_raouf
چهارشنبه 26 فروردین 1394, 09:00 صبح
من یک تابع نوشتم که خودم خیلی ازش استفاده می کنم برای شما هم می زارم هم برای این کاری که می خواین به درد می خوره هم شاید به درد بقیه بخوره
public static bool IsKindOfType(Type Type, Type BaseType)
{
Type CounterType = Type;
while (CounterType != null)
{
if (CounterType == BaseType)
return true;
CounterType = CounterType.BaseType;
}
Type[] allInterfaces = Type.GetInterfaces();
foreach (Type InType in allInterfaces)
if (InType == BaseType)
return true;
return false;
}
public static List<Control> GetAllSubControls(Control Ctl, params Type[] BaseTypes)
{
if (BaseTypes == null || BaseTypes.Length == 0)
BaseTypes = new Type[1];
for (int i = 0; i < BaseTypes.Length; i++)
if (BaseTypes[i] == null)
BaseTypes[i] = typeof(Control);
List<Control> lstCont = new List<Control>();
foreach (Control x in Ctl.Controls)
lstCont.Add(x);
for (int i = 0; i < lstCont.Count; i++)
foreach (Control x in lstCont[i].Controls)
lstCont.Add(x);
for (int i = lstCont.Count - 1; i >= 0; i--)
{
bool blnOk = false;
foreach (Type BType in BaseTypes)
if (IsKindOfType(lstCont[i].GetType(), BType))
{
blnOk = true;
break;
}
if (!blnOk)
lstCont.RemoveAt(i);
}
return lstCont;
}

تابع IsKindOfType رو شما مستقیما احتیاج ندارید بلکه برای کارتون از تابع GetAllSubControls استفاده کنید
نحوه کارشم اینجوریه:
مثلا فرض کنید می خواید همه Label های یک فرم رو بارگذاری کنید:
تابع رو اینحوری باید براخوانی کنید:

List<Control> lstLable = GetAllSubControls(this, typeof(Label));
foreach (Control lbl in lstLable)
lbl.Enabled = false;

با این کد هر چی label توی فرمتون باشه توی یک لیست قرار می گیره(حتی اگر داخت یک panel یا هر چیز دیگه باشه)
حالا مثلا فرض کنید می خواید تمام TextBox ها و Button های فرمتون رو برگردانید کافیه تابع رو اینجوری فراخونی کنید:
List<Control> lstControl = GetAllSubControls(this, typeof(TextBox), typeof(Button));

ضمنا می تونید به جای this یک پنل رو قرار بدین که در این صورت فقط کنترل های داخل اون پنل بر گردانده می شوند
امیدوارم بدردتون بخوره