PDA

View Full Version : تبدیل رشته به نام کنترل



svhasvha
یک شنبه 18 آذر 1397, 14:15 عصر
سلام یه menuStrip تو فرم اصلیم دارم حالا بعد از صفحه لاگین وبررسی دسرسی میخوام یه تعداد از منوهای اونو غیر فعال کنم
برای اینکار یه جدول از اسامی منو هایی که این کد کاربری وارد شده نباید به اونها دستری ذاشته باشه رو از بانک اطلاعتی بیرون کشیدم
حالا تو یه حلقه میخوام بگم ایتم های با این اسم ها رو غیر فعال کن

foreach (DataRow row in Connection.DataSet().Tables[0].Rows)
{

((Control)row[0].ToString()).Enabled = false;
}

قبلا یادمه از یه همچین کدی استفاده میکردم که رشته ها رو تبدیل به نام کنترل میکردم ولی الان خطا میده
خلاصه اینکه من یه رشته دارم حالا چطور بگم کنترلی که اسمش اینه رو غیر فعل کن
تو نتم چیزی پیدا نکردم
مطمعنم که قبلا از یه همچین کدی استفاده کردم تو پروژه های دیگه و لی دقیق یادم نمیاد

((control)"string").Enabled......



149399
میخوام یه سری از این منو ها ویا زیر منو ها رو غیر فعال کنم
که لیستی از اسامیشونو دارم چطور این اسامی رو تبدیل کنم به نام این منو ها
؟

mrbm_2007
یک شنبه 18 آذر 1397, 20:02 عصر
باید ببینید این کنترل ها که می گی داخل کدوم کنترل هستند، مثلا اگر داخل یه کنترل یه اسم menu1 باشند (یعنی این parent شون باشه) میشه این کار رو کرد

menu1.Controls["some_name"];


البته اگر این رشته واقعا اسم کنترل باشه، ولی اگر محتوا یا Text اون باشه باید با یه حلقه for توی کنترل ها بگردی و پیداش کنی

svhasvha
دوشنبه 19 آذر 1397, 07:55 صبح
ممنون از جوابت اما کار نمیده این کد
نهایتن با راهنمایی های که دوستان نکردن به این نتیجه رسیدم
کل ایتم های که menuStrip داره رو تو حلقه بزارم و هر بار چک کنم اسم ایتم رو اگه اکی بود غیر فعالش کنم
که خودم اصلا با این کار موافق نیستم و هزینش زیاده

بازم ممنون

رامین مرادی
دوشنبه 19 آذر 1397, 08:31 صبح
شما میتونید از forech استفاده کنید به این صورت



foreach (MenuItem item2 in mymenu.Items)
{
if(item2.Name="نام منو")
{
item2.visable=false;
}
}



تو نوت پد نوشتم خودتون اصلاح کنید.

svhasvha
دوشنبه 19 آذر 1397, 08:58 صبح
شما میتونید از forech استفاده کنید به این صورت



foreach (MenuItem item2 in mymenu.Items)
{
if(item2.Name="نام منو")
{
item2.visable=false;
}
}



تو نوت پد نوشتم خودتون اصلاح کنید.


سلام ممنون از وقتی که گذاشتی فقط دوتا مورد
1 اینکه این کد ی که نوشتی فقط منو های اصلی رو میبینه و زیر منو ها رو چک نمیکنه
2 اینکه با حلقه زیاد موافق نیستم چون هزینه زمانیش زیاده هرچند ظاهرا مجبورم از همین استفاده کنم
قطعا باید یه راهی باشه که تکست رو تبدیل به نام ایتم کرد و بعد غیر فعالش کرد
در هر صورت بازم ممنون

svhasvha
دوشنبه 19 آذر 1397, 09:42 صبح
برای انجامش مجبور شدم این کارو انجام بدم
هرچند هنوزم با حلقه موافق نیستم

مینویسم تا بقیه هم استفاده کنن
اول این متد رو اضافه کردم

private IEnumerable<ToolStripItem> GetItems(ToolStripItem item)
{
if (item is ToolStripMenuItem)
{
foreach (ToolStripItem tsi in (item as ToolStripMenuItem).DropDownItems)
{
if (tsi is ToolStripMenuItem)
{
if ((tsi as ToolStripMenuItem).HasDropDownItems)
{
foreach (ToolStripItem subItem in GetItems((tsi as ToolStripMenuItem)))
yield return subItem;
}
yield return (tsi as ToolStripMenuItem);
}
else if (tsi is ToolStripSeparator)
{
yield return (tsi as ToolStripSeparator);
}
}
}
else if (item is ToolStripSeparator)
{
yield return (item as ToolStripSeparator);
}
}


بعد تو لود فرمم
اینو نوشتم

//این یه کلاسه که خودم نوشتم وشما باید به هر روشی که میدونید لیست منوهای که نباید دسترسی داشته باشن رو بیرون بکشید
Connection.connect("SELECT_NOT_DASRESI", public_variabel.par = new string[] { "@_username" }, public_variabel.obj = new object[] { Parametr_pas.get_username() }, 1, true, false);

List<ToolStripItem> allItems = new List<ToolStripItem>();
foreach (ToolStripItem toolItem in menuStrip1.Items)
{
allItems.Add(toolItem);
//add sub items
allItems.AddRange(GetItems(toolItem));
}
foreach (DataRow row in Connection.DataSet().Tables[0].Rows)

foreach (ToolStripItem toolItem in allItems)
{
if (toolItem.Name == row[0].ToString())
toolItem.Enabled = false;
}


اما اگه کسی از دوستان میتونه کمک کنه از همون روش که اول گفتم این کار انجام بشه خیلی خیلی بهتره

foreach (DataRow row in Connection.DataSet().Tables[0].Rows)
{

((Control)row[0].ToString()).Enabled = false;
}





یعنی تکست رو تبدیل به نام ایتم کنیم

shahryari
دوشنبه 19 آذر 1397, 13:18 عصر
سلام
Button btn = (Button)this.Controls["button5"];
btn.Enabled = false;

this.Controls["button5"].Enabled= false;

mrbm_2007
دوشنبه 19 آذر 1397, 13:19 عصر
اما اگه کسی از دوستان میتونه کمک کنه از همون روش که اول گفتم این کار انجام بشه خیلی خیلی بهتره

foreach (DataRow row in Connection.DataSet().Tables[0].Rows)
{

((Control)row[0].ToString()).Enabled = false;
}





یعنی تکست رو تبدیل به نام ایتم کنیم


مطمئن باش اینجور چیزی اصلا وجود نداره!!!

svhasvha
دوشنبه 19 آذر 1397, 15:03 عصر
سلام
Button btn = (Button)this.Controls["button5"];
btn.Enabled = false;

this.Controls["button5"].Enabled= false;

ممنون از راهنماییت

l

svhasvha
دوشنبه 19 آذر 1397, 15:04 عصر
مطمئن باش اینجور چیزی اصلا وجود نداره!!!

سلام مطمئن باش یه همچین چیزی وجود داره چون خودم قبلا ازش استفاده کردم ولی نگارشش یادم رفته
درهر صورت ممنون

336699
دوشنبه 19 آذر 1397, 16:54 عصر
یک مثال برای تکست باکس

List<string> list1 = new List<string>();

list1.Add("textBox1");
list1.Add("textBox2");
list1.Add("textBox3");
list1.Add("textBox4");

foreach (string txt in list1)
{
TextBox tbx = this.Controls.Find(txt, true).FirstOrDefault() as TextBox;
if (tbx != null)
tbx.Enabled = false;

}


برای منو


List<string> list1 = new List<string>();

list1.Add("item1");
list1.Add("item2");
list1.Add("item3");
list1.Add("item4");

foreach (string txt in list1)
{
ToolStripMenuItem items = menuStrip1.Items.Find(txt, true).FirstOrDefault() as ToolStripMenuItem;
if (items != null)
items.Enabled = false;
}



«دوچیز بی‌پایان است: اول «کهکشان»، دوم «حماقت بشر»، در مورد اول زیاد مطمئن نیستم.»

mr.sirwan
دوشنبه 19 آذر 1397, 17:14 عصر
البته با روش بازگشتی یا recursive هم قابل انجامه، یه متد مینویسی که یه پارامتر ورودی از نوع toolstripmenu یا آیتمش میگیره حالا داخل متد باید به ازای هر فرزندی که این منو داره دوباره متد رو با پارامتر فرزند این منو فراخوانی کنی و در هر فراخوانی عملیات چک کردن اسم آیتم و غیرفعال کردنشون رو انجام میدی

mrbm_2007
دوشنبه 19 آذر 1397, 20:40 عصر
سلام مطمئن باش یه همچین چیزی وجود داره چون خودم قبلا ازش استفاده کردم ولی نگارشش یادم رفته
درهر صورت ممنون

باشه، شاید شما تجربه بیشتری توی #C داری، یادت اومد اینجا بذار!
ولی من با تجربه 10 ساله خودم میگم اینجور چیزی وجود نداره که استرینگ رو به کنترل کست کنه!

svhasvha
سه شنبه 20 آذر 1397, 09:38 صبح
باشه، شاید شما تجربه بیشتری توی #C داری، یادت اومد اینجا بذار!
ولی من با تجربه 10 ساله خودم میگم اینجور چیزی وجود نداره که استرینگ رو به کنترل کست کنه!
دوستم گلماول اینکه ما جسارت نکردیم
دوم اینکه ممنون از وقتو پیگیریت
یه چیزایی یادم اومد که میزام
حالا شما لطف کنید ببینید چطور اینو تامیم بدیم به ایتم های menuStrip
Control ctn = this.Controls["label1"];
ctn.BackColor = Color.Red;

دقیقا می خوام همین اتفاق برای ایتم های منو بیفته
من یه لیست از اسامی ایتم ها دارم حالا بدون استفاده از هیچ حلقه ای و جستجویی میخوام مستقیم بگم ایتمی که اسمش اینه رو غیر فعال کن!!!

svhasvha
سه شنبه 20 آذر 1397, 09:42 صبح
سلام ممنون از راهنماییت جوابتون کاملا درست و قابل انجامه اما مشکل اینجاست نمی خوام چیزی رو چک کنم و نه حلقه استفاده کنم
من میخوام با استفاده از اسمی که از ایتم دارم مستقیم اونو صدا کنم و....
سادش این که اسم ایتم رو دارم حالا میخوام بگم ایتمی که اسمش اینه مثلا غیر فعال بشه یا تکستش این بشه یا........

Mahmoud.Afrad
سه شنبه 20 آذر 1397, 09:51 صبح
سلام ممنون از راهنماییت جوابتون کاملا درست و قابل انجامه اما مشکل اینجاست نمی خوام چیزی رو چک کنم و نه حلقه استفاده کنم
من میخوام با استفاده از اسمی که از ایتم دارم مستقیم اونو صدا کنم و....
سادش این که اسم ایتم رو دارم حالا میخوام بگم ایتمی که اسمش اینه مثلا غیر فعال بشه یا تکستش این بشه یا........

مجبور به جستجو هستید. برای منو چون دارای زیرمنو هست از یک متد بازگشتی استفاده کنید.

svhasvha
سه شنبه 20 آذر 1397, 13:01 عصر
به نظرم مجبور نباشم!! چون مستقیم میتونم ایتم هار صدا کنم !!!
یعنی مستقیم میتونم اسم زیر منور وصدا کنم وغیر فعالش کنم

رامین مرادی
سه شنبه 20 آذر 1397, 13:27 عصر
سلام ممنون از وقتی که گذاشتی فقط دوتا مورد
1 اینکه این کد ی که نوشتی فقط منو های اصلی رو میبینه و زیر منو ها رو چک نمیکنه
2 اینکه با حلقه زیاد موافق نیستم چون هزینه زمانیش زیاده هرچند ظاهرا مجبورم از همین استفاده کنم
قطعا باید یه راهی باشه که تکست رو تبدیل به نام ایتم کرد و بعد غیر فعالش کرد
در هر صورت بازم ممنون

برا زیر منو ها حلقه های داخلی ایجاد کنید. من برا خوانایی بیشتر یک حلقه نوشتم.
مگه چندتا منو دارید؟:متفکر: من خودم فعلا و در حال حاضر 182 تا منو و زیر منو دارم که تا سه سطح هستند. با خیال راحت میتونم بگم کمتر از یک ثانیه این عملیات مخفی کردن منو انجام میشه. کاربر این موردو اصلا متوجه نمیشه. امتحان کنید ببینید چقدر ملموسه این مورد که دنبال جایگزین روش دیگه ای هستید.