PDA

View Full Version : سوال: بدست آوردن نام تمام فرم های برنامه



prans_tork
شنبه 23 خرداد 1394, 13:29 عصر
دوستان کسی میدونه چطوری باید نام تمام فرمای موجود در برنامه رو لیست کرد با کد نویسی
البته:
Application.openform هست اما فقط فرم های باز رو بر میگردونه و نه همه فرم هارو.
لطفاً راهنمایی کنید که چطور میشه نام فرم های برنامه رو لیست کرد
برای طراحی سطوح دسترسی یک پروژه لازم دارم

ممنون

moradian
شنبه 23 خرداد 1394, 18:50 عصر
سلام دوست من
ببین به کارت میاد (البته چند تا از کادرهای محاوره ای اپلیکیشن که از کلاس فرم ارث بری کرده رو هم تو لیست میاره، می تونی اون موارد رو فیلترش کنی):


using System.Reflection;
...
List<String> formNames = new List<string>();
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly a in assemblies)
{
Type[] types = a.GetTypes();
foreach (Type t in types)
{
if (t.IsPublic && t.BaseType == typeof(Form))
{
formNames.Add(t.Name);
}
}
}
listBox1.DataSource = formNames;

البته میشه همه این کدها رو تو یه خط با روش لینک یا لامبدا اکسپرشن خلاصه کرد (از شیرینی های سی شارپ):
روش لینک:


listBox1.DataSource = (from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where t.IsPublic && t.BaseType == typeof(Form)
select t.Name).ToList();

روش لامبدا:


listBox1.DataSource = (AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes(), (a, t) => new {a, t})
.Where(@t1 => @t1.t.IsPublic && @t1.t.BaseType == typeof (Form))
.Select(@t1 => @t1.t.Name)).ToList();

گر ایشینن گلیر :D یاشاسین آذربایجان

prans_tork
شنبه 23 خرداد 1394, 20:53 عصر
سلام دوست من
ببین به کارت میاد (البته چند تا از کادرهای محاوره ای اپلیکیشن که از کلاس فرم ارث بری کرده رو هم تو لیست میاره، می تونی اون موارد رو فیلترش کنی):


using System.Reflection;
...
List<String> formNames = new List<string>();
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly a in assemblies)
{
Type[] types = a.GetTypes();
foreach (Type t in types)
{
if (t.IsPublic && t.BaseType == typeof(Form))
{
formNames.Add(t.Name);
}
}
}
listBox1.DataSource = formNames;

البته میشه همه این کدها رو تو یه خط با روش لینک یا لامبدا اکسپرشن خلاصه کرد (از شیرینی های سی شارپ):
روش لینک:


listBox1.DataSource = (from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where t.IsPublic && t.BaseType == typeof(Form)
select t.Name).ToList();

روش لامبدا:


listBox1.DataSource = (AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes(), (a, t) => new {a, t})
.Where(@t1 => @t1.t.IsPublic && @t1.t.BaseType == typeof (Form))
.Select(@t1 => @t1.t.Name)).ToList();

گر ایشینن گلیر :D یاشاسین آذربایجان

از توجهت ممنونم دوست عزیز
و نوکرم سنه:قلب:

من این کد رو نوشتم و متأسفانه فکر کنم که تنها راه ممکنه
اما یه مشکلی هست و اونم اینکه:
من توی پروژه از یک PersianDateTimePicker استفاده کردم و نمیدونم چرا وقتی با این کد، اسمبلی در حال اسکن هست، به این UserControl گیر میده که ریفرنسش خالیه:

Type[] AllTypesInProjects = Assembly.GetExecutingAssembly().GetTypes(); DevComponents.AdvTree.Node treeNode;


for (int i = 0; i < AllTypesInProjects.Length; i++)
{
try
{
if (AllTypesInProjects[i].Namespace == "AmaniRdSnGraphi")
{
if (AllTypesInProjects[i].Name.StartsWith("Frm"))
{
Office2007Form f = (Office2007Form)Activator.CreateInstance(AllTypesI nProjects[i]);
//((Office2007Form)AllTypesInProjects[i].Name) f = ((Office2007Form)AllTypesInProjects[i].Name);
if (!string.IsNullOrEmpty(f.TitleText))
{
string FormText = f.TitleText;
treeNode = new DevComponents.AdvTree.Node(FormText);
advTree1.Nodes.Add(treeNode);
}

}
}


}
catch (Exception)
{


}


}

حتی همونطور که میبینی با توجه به اینکه اسم همه فرم هام با Frm شروع میشه و همچنین اینکه NameSpace این Usercontrol با پروژه فرق داره، فیلتر گذاشتم با IF که این دیتاپیکر وارد پروسه نشه و باز حتی try و Catch کردم که لااقل خطا کنترل بشه. حتی کل اسمبلی رو زیر و رو کردم و دیدم که هیچ Type برای این دیتاپیکر توش نیست.
ولی بازم بهش گیر میده. درصورتی که اصلا ربطی به این ماجرا نداره
عکس خطاشم میزارم
ممنون میشم دوستان نظرشون رو بگن


132224

لازم به توضیحه که چون از DotNetBar استفاده کردم توی پروژه، پس نمیتونم از BaseType فرم استفاده کنم

prans_tork
شنبه 23 خرداد 1394, 22:28 عصر
بعد از کلی تست متوجه شدم که با این خط مشکل پیش میاد:
Office2007Form f = (Office2007Form)Activator.CreateInstance(AllTypesI nProjects[i]);