PDA

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



a-erfani
پنج شنبه 12 مرداد 1391, 22:57 عصر
با سلام به همه دوستان
من يك برنامه (soulotion) با چندين پروژه درون آن دارم. اسم تمامي فرمها در ديتابيس ذخيره شده است. وقتي كاربر
لاگين مي كند با توجه به دسترسي هاي تعريف شده براي آن، به ازاي هر فرمي كه دسترسي داشته باشد يك دكمه در فرم اصلي برنامه براي اون ايجاد مي شود. حالا مي خواهم كاربر با كليك روي اين دكمه ها فرمهاي مربوط به هركدام را ( كه اسم آن را بصورت استرينگ يا رشته داريم) اجرا كند.
در اين مورد خيلي جستجو كردم فقط يك راه پيشنهاد شده بود و آن استفاده از Reflection ها بود. ولي از آن چيزي متوجه نشدم.
لطفا راهنمايي فرماييد.

Mahmoud.Afrad
پنج شنبه 12 مرداد 1391, 23:10 عصر
به نظرم راه سختی را برای اعمال سطح دسترسی انتخاب کردید.(ذخیره نام فرم های مجاز برای هر شخص اشتباست)
به جاش اینکه شخص میتونه به اون فرم دسترسی داشته باشه یا نه رو باید ذخیره کرد:

راه اول: کافیست در دیتابیس در جدولی که برای سطوح دسترسی درنظر گرفتید به ازای هر فرم و منو و.... که میخواهید محدودیت قائل بشید یک فیلد از نوع boolean در نظر بگیرید و سطح دسترسی را برای هر کاربر تعیین کنید. در قسمت طراحی فرم هم تمام دکمه ها و منوها را طراحی کنید و فقط در هنگام لاگین اگر کاربر مجاز بود اونوقت مقادیر سطح دسترسی را از دیتابیس خوانده و اعمال کنید(باتن ها و منوهایی که نباید دسترسی داشته باشه را مخفی(یا disable) کنید).

راه دوم: یا اینکه اگر سطوح دسترسی مشخص هست (مثلا مدیر دسترسی کامل ، اپراتور دسترسی محدودتر و ...) کافیه یک فیلد در نظر بگیرید و نوع دسترسی رو برای کاربر ذخیره کنید و موقع لاگین برحسب سطح دسترسی(اینکه چه شخصی لاگین میکنه) برای کنترل ها تصمیم بگیرید.

a-erfani
پنج شنبه 12 مرداد 1391, 23:23 عصر
ممنون از پاسختون
تعداد فرم هاي برنامه خيلي زياد هست. كاربر وقتي لاگين ميكنه بر اساس نوع سيستمي كه انتخاب مي كنه زير سيستم هايي كه به آن دسترسي دارد مشخص مي شود. براي اينكار هم از متغير هايي از نوع Bool استفاده كردم. امكان طراحي يك مدل از قبل طراحي شده وجود ندارد بلكه بايد بصورت دايناميك دكمه هاي مورد نظر ساخته شود.
براي مثال كاربر سيستم انبار را انتخاب مي كند و بايد براي او زيرسيستم هاي ارسال،انبارش و... كه هركدام داراي فرمهاي زيادي است آورده شود.
قبلا اسم تمامي فرمها در ديتابيس ذخيره شده است. مشكل من فقط نمايش اين فرمها با فرض دانستن اسم آنها در برنامه است.

nilmil_nil
پنج شنبه 12 مرداد 1391, 23:33 عصر
من یه راه حل پیشنهاد میکنم
خودم هم از هیمن راه حل همیشه استفاده میکنم
توی جدول یوزر ها یه فیلد تعرفی کن از نوع رشته ای
حالا به ازای هر سطح دسترسی 0 یا 1 رو بذار
مثلا برای فرم اشخاص:0111
که به ترتیب اضافه و ویرایش و حذف و نمایش و به همین ترتیب بقیه رو هم کنارش میذاری
که خودش میشه یه رشته بزرگ مثل 1010111100001111000 حالا کفایه با یه تابع این رشته رو به یه آرایه کاراکتری یا بولین تبدیل کنی و هرکدوم از این صفر و یک ها رو به دکمه یا منو یا هرجای دیگه ای اختصاص بدی
فقط برای هر کدوم یه کامنت بذار که بدها یادت بمونه
مزیت این کار اینه که شما هر تعداد دیگه هم بخوای اضافه کنی کافیه فقط به 0و1 ها اضاف کنی
و کاری به ساختار جدول نداری

Mahmoud.Afrad
پنج شنبه 12 مرداد 1391, 23:43 عصر
ممنون از پاسختون
تعداد فرم هاي برنامه خيلي زياد هست. كاربر وقتي لاگين ميكنه بر اساس نوع سيستمي كه انتخاب مي كنه زير سيستم هايي كه به آن دسترسي دارد مشخص مي شود. براي اينكار هم از متغير هايي از نوع Bool استفاده كردم. امكان طراحي يك مدل از قبل طراحي شده وجود ندارد بلكه بايد بصورت دايناميك دكمه هاي مورد نظر ساخته شود.
براي مثال كاربر سيستم انبار را انتخاب مي كند و بايد براي او زيرسيستم هاي ارسال،انبارش و... كه هركدام داراي فرمهاي زيادي است آورده شود.
قبلا اسم تمامي فرمها در ديتابيس ذخيره شده است. مشكل من فقط نمايش اين فرمها با فرض دانستن اسم آنها در برنامه است.

خوب بالاخره هر زیر سیستم یکسری فرم و باتن و منو و .... داره دیگه که باید نمایش بدید. اول کل باتن ها و منو ها و ... را طراحی کنید و بعد در قسمت لاگین برحسب اینکه چه زیر سیستمی انتخاب میشه کنترلهای غیرلازم را hide کنید(یا اصلا dispose کنید). در هر باتن هم با کد از قبل نوشته شده ، یک فرم را نمایش میدید. توی این راه حل ایجاد محدودیت با hide و show کردن باتن ها و منوها کاملا برطرف میشه و نیازی به ایجاد داینامیک نیست.

a-erfani
جمعه 13 مرداد 1391, 11:33 صبح
با سلام به همه دوستان
من يك برنامه (soulotion) با چندين پروژه درون آن دارم. اسم تمامي فرمها در ديتابيس ذخيره شده است. وقتي كاربر
لاگين مي كند با توجه به دسترسي هاي تعريف شده براي آن، به ازاي هر فرمي كه دسترسي داشته باشد يك دكمه در فرم اصلي برنامه براي اون ايجاد مي شود. حالا مي خواهم كاربر با كليك روي اين دكمه ها فرمهاي مربوط به هركدام را ( كه اسم آن را بصورت استرينگ يا رشته داريم) اجرا كند.
در اين مورد خيلي جستجو كردم فقط يك راه پيشنهاد شده بود و آن استفاده از Reflection ها بود. ولي از آن چيزي متوجه نشدم.
لطفا راهنمايي فرماييد.

سلام مجدد
كسي از دوستان در زمينه Reflection مي تواند كمي كند؟

Reza_Yarahmadi
جمعه 13 مرداد 1391, 11:56 صبح
كسي از دوستان در زمينه Reflection مي تواند كمي كند؟
اگه همه فرمها توی یک اسمبلی باشه
Assembly assem = Assembly.GetEntryAssembly();
object forms = assem.CreateInstance("WindowsFormsApplication1.Form1");
if (forms != null)
((Form)forms).Show();

a-erfani
جمعه 13 مرداد 1391, 12:27 عصر
اگه همه فرمها توی یک اسمبلی باشه
Assembly assem = Assembly.GetEntryAssembly();
object forms = assem.CreateInstance("WindowsFormsApplication1.Form1");
if (forms != null)
((Form)forms).Show();

خيلي ممنون از پاسختون
ولي من در برنامه ام چندين پروژه دارم. وقتي كد شما را استفاده مي كنم فقط براي پروژه اصلي جواب مي دهد و براي بقيه پروژه ها مقدار forms برابر null مي شود.
لطفا راهنمايي نماييد.

a-erfani
جمعه 13 مرداد 1391, 14:03 عصر
با سلام
كسي نبود راهنمايي كند؟

a-erfani
جمعه 13 مرداد 1391, 17:13 عصر
با سلام به همه دوستان
بالاخره مشكل با اين كد حل شد.

string formName = "namespace.Form1";
var asm = Assembly.Load("namespace");
Type formType = asm.GetType(formName);
Form f = (Form)Activator.CreateInstance(formType);
f.Show();
از همه بخاطر توجه و پاسخهايشان متشكرم.
:لبخندساده::لبخند: