PDA

View Full Version : تغییر پراپرتی باتن با پارامتر نام از نوع استرینگ



mz6488
دوشنبه 24 آذر 1393, 00:00 صبح
سلام.می خوام یه متد درست کنم که پراپرتی باتن رو تغییر بده.پارامتر ورودی هم نام باتن از نوع استرینگ.چجوری با نام از از نوع استرینگ میشه پراپرتی اون باتن رو تغییر داد؟

mz6488
دوشنبه 24 آذر 1393, 00:21 صبح
کدش رو پیدا کردم

string ctrlName = "btnTest";
this.Controls[ctrlName].Enabled =false;


مشکلی که این کد داره این که اگه کنترل تو یه گروپ باکس یا پنل باشه یا اینکه باتن به صورت منو باشه دیگه نمیشه از this استفاده کرد و باید نام اون فرضا گروپ باکس رو استفاده کنیم.کسی راه دیگه ای به ذهنش میرسه؟

plus
دوشنبه 24 آذر 1393, 06:53 صبح
از متد Find استفاده کنید.خروجی آرایه هست چون ممکنه بیش از یک Control پیدا بشه.

Control[] controls = this.Controls.Find(ctrlName, true);

forodo
دوشنبه 24 آذر 1393, 07:38 صبح
سلام
با یه متد بازگشتی که تمام کنترل هارو، چه داخل گروپباکس و چه داخل هر چیزه دیگه ای بررسی کن و مثلاً:
foreach(Control ali in this.controls)
{
if(ali.name = "btnAli")
{
ali.Enabled = false;
}
}
حالا اون foreach باید بازگشتی باشه.
توی همین سایت نمونه کد پیدا کردن کنترل داخل هر کنترل دیگه ای هست.

mz6488
دوشنبه 24 آذر 1393, 09:16 صبح
سلام
با یه متد بازگشتی که تمام کنترل هارو، چه داخل گروپباکس و چه داخل هر چیزه دیگه ای بررسی کن و مثلاً:
foreach(Control ali in this.controls)
{
if(ali.name = "btnAli")
{
ali.Enabled = false;
}
}
حالا اون foreach باید بازگشتی باشه.
توی همین سایت نمونه کد پیدا کردن کنترل داخل هر کنترل دیگه ای هست.
چجوری به صورت بازگشتی پیاده سازیش کنم؟نمونه کدش رو پیدا نکردم

forodo
دوشنبه 24 آذر 1393, 09:35 صبح
این تابعش هست:
private void ChangeControls(Control c)
{
foreach (Control c in c.Controls)
{
if (c.Name == "btnAli")
{
// کارهای مورد نظر
}
}
}
این کدها هم توی جایی که می خوای ازش استفاده کنید می نویسید. مثلاً توی رویداد کلیک دکمه یا هرجایی که نیازه:
foreach (Control c in this.Controls)
{
if (c.Name == "btnAli")
{
// کارهای مورد نظر
}
ChangeControls(c);
}

mz6488
دوشنبه 24 آذر 1393, 10:00 صبح
این تابعش هست:
private void ChangeControls(Control c)
{
foreach (Control c in c.Controls)
{
if (c.Name == "btnAli")
{
// کارهای مورد نظر
}
}
}
این کدها هم توی جایی که می خوای ازش استفاده کنید می نویسید. مثلاً توی رویداد کلیک دکمه یا هرجایی که نیازه:
foreach (Control c in this.Controls)
{
if (c.Name == "btnAli")
{
// کارهای مورد نظر
}
ChangeControls(c);
}
متاسفانه این کد واس باتن منویی کامپوننت dev جواب نداد

forodo
دوشنبه 24 آذر 1393, 10:07 صبح
برای بقیه کنترلها کار کرد؟
من خودم همیشه از این استفاده می کنم و مشکلی تا حالا پیدا نکردم.
شرمنده. دیگه نمی دونم.

forodo
دوشنبه 24 آذر 1393, 10:13 صبح
ببین اینا می شه:
اینو بر اساس نیازت تغییر بده.
foreach (GridViewRow row in gv.Rows)
{

string basicrate =row.FinControl("lblBasicRate") as Label).Text;;

}
اینم که همون بازگشتیه هستش: شما خودت باز داخلش بر اساس تو در تویی foreach بذاری ببین می شه.
foreach (Control c in Page.Controls)
{
foreach (Control childc in c.Controls)
{
if (childc is TextBox)
{
allTextBoxValues += ((TextBox)childc).Text + ",";
}
}
}

مهرداد صفا
سه شنبه 25 آذر 1393, 17:32 عصر
متاسفانه این کد واس باتن منویی کامپوننت dev جواب نداد
سلام.
با استفاده از reflection می تونید هر مقدار از هر عضوی رو فقط با داشتن نامش (به صورت string) تغیر بدید.
به این صورت:

ChangeFieldValue("button1", "BackColor", (object)Color.Black);
//...
//..

void ChangeFieldValue(string memberName, string propertyName,Object value)
{
var member = this.GetType().GetField(memberName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static|System.Refle ction.BindingFlags.IgnoreCase );
setPropertyValue(member.GetValue(this), propertyName, value);
}

void setPropertyValue(object objInstance, string propertyName, object value)
{
var property = objInstance.GetType().GetProperty(propertyName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase);
property.SetValue(objInstance , value, null);
}