PDA

View Full Version : نمایش فرمهای مختلف فقط با یک بار new



رها
چهارشنبه 02 آبان 1386, 10:53 صبح
سلام
همیشه معمول اینه که وقتی یک فرم بخواد نمایش داده بشه از نوع اون یک شی ساخته و نمایش داده می شه.
مثل کد زیر


frmChange frm =new frmChange();
frm.Show();

اما فرض کنید ما توی یک فرم باید فرمی رو که نمایش داده بشه بر اساس انتخاب کاربر نمایش بدیم یعنی فقط می دونیم که نام فرم مورد نظر چیه. یه راه واسه نمایش فرم براساس حالتهای مختلف اینه که تمام حالتها رو چک کنیم اما این روش وقتی تعداد فرمها بالا بره و با پیشرفت پروژه زیاد تر هم بشه دردسر داره.
من می خوام فقط با دانستن نام فرم بشه اون رو نمایش داد یعنی مجبور نباشم به ازای هر نوع فرمی که دارم یه دستور new جداگانه بنویسم.
طبق جستجوهایی که من کردم Activator.CreateNewInstance همچین کاری رو می تونه انجام بده اما من نتونستم باهاش کار کنم.
کسی از دوستان روشی برای حل این مشکل سراغ داره؟
ممنون

رها
چهارشنبه 02 آبان 1386, 13:21 عصر
حالا می فهمم چه جوری می شه که آدم وسط اقیانوس می تونه درخت گیر بیاره و ازش بالا بره.
مشکل رو حل کردم. قبل از هرچیز دلیل لینکه دنبال همچین کاری می گشتم رو می گم.
من توی پروژه ام جستجوی پویا گذاشته ام که کاربر می تونه موجودیت رو انتخاب کنه و لیست فیلدهاش رو ببینه و با استفاده از اونها و عملگرهایی که در اختیارش هست شرط منطقی بسازه و در پایان نتیجه جستجوش رو مشاهده کنه و روی هرکدوم از رکوردهای نتیجه که رفت بتونه با فشردن یک دکمه ویرایش فرم ویرایش مربوطه رو ببینه و اطلاعات رو ویرایش کنه.
برای تشخیص اینکه چه فرمی باید باز بشه باید به موجودیتی که کاربر انتخاب کرده توجه می کردم و من نام فرم مربوط به موجودیت رو در جدول موجودیتهام ذخیره کردم و الان با روشی که توضیح می دم با چند خط کد فرم مربوط به همون موجودیت رو نمایش می دم.
برای این کار قبل از هرچیز باید یک با پروژه رو به نوع Class Library کامپایل کنید و خروجی dll مربوطه رو یه جایی کپی کنید چون با برگرداندن پروژه به نوع قبل فایل dll پاک می شه.
حالا فایل dll رو تو پوشه debug کنار فایل exe قرار بدید.
با کد زیر می تونید فرم دلخواه رو از درون dll لود کرده و نمایش بدید.


Assembly a = Assembly.LoadFrom("MyProject.dll");
Type type;
type= a.GetType("MyProjectNameSpace.myFormClassName");
Form f = (Form)a.CreateInstance(type.ToString());
f.Show();

یک نکته : ورودی متد GetType نام کامل کلاس مربوط به فرم هست یعنی NameSpace+.ClassName

اَرژنگ
چهارشنبه 02 آبان 1386, 16:47 عصر
مرسی که زحمت کشیدید و این کد را نوشتید.
روش درست اینگونه کارها استفاده از آرکیتچر پلاگین و ابسترکت فاکتوری پترن هستند. این گونه تکه کدها از نظر تکنیکی جالب هستند ولی وقتی که با یک متدلوژی استفاده بشند بیشتر بکار میاند.
در ضمن با این روش فرمها را فقط باهاشان میتوانید از کلاس فرم کار کنید، استفاده از اینترفیس و بیلدر پترن تواناهایی دیگری را در اختیار میگذارد.

رها
چهارشنبه 02 آبان 1386, 18:31 عصر
مرسی که زحمت کشیدید و این کد را نوشتید.
روش درست اینگونه کارها استفاده از آرکیتچر پلاگین و ابسترکت فاکتوری پترن هستند. این گونه تکه کدها از نظر تکنیکی جالب هستند ولی وقتی که با یک متدلوژی استفاده بشند بیشتر بکار میاند.
در ضمن با این روش فرمها را فقط باهاشان میتوانید از کلاس فرم کار کنید، استفاده از اینترفیس و بیلدر پترن تواناهایی دیگری را در اختیار میگذارد.

در مورد روشها و متدهایی که صجبت کردید تحقیق می کنم اما آیا مثال یا لینکی سراغ دارید که من رو سریعتر به هدف برسونه؟
ممنون

اَرژنگ
چهارشنبه 02 آبان 1386, 18:36 عصر
1) آموزش ساخت plug in با استفاده از Vb.net and C#.net (http://www.barnamenevis.org/forum/showthread.php?t=69264)
میگردم ، بازهم لینک و مثال پیدا میکنم اینجا میفرستم