PDA

View Full Version : سوال: تعریف یک unTyped Dataset قابل استفاده در کل فرم های پروژه C#‎



bita_naz
جمعه 04 مهر 1393, 22:56 عصر
با سلام
من یک پروژه با چندین فرم دارم ولی میخواهم فقط یک دیتاست اصلی که متشکل از چندین جدول است برای کل پروژه و فرمها تعریف کنم
به عبارت دیگه دیتاستی رو که در فرم آغازین پروژه تعریف کردم رو در دیگر فرمها ببینم و از طریق فرمهای دیگه جداول اونو پر کنم
چطور این کار عملی است. ؟
البته در سی شارپ منظورم هست نه وی بی
در ضمن دیتاست من از نوع untyped هستش و از هیچ نوع دیتابیسی استفاده نمیکنم
کلا یک پروژه ساده و کوچیک هستش که نهایتا دادههاشو توی فایل XML ذخیره میکنم

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

میخواستم بدونم کسی راه بهتری سراغ نداره؟؟؟

با تشکر فراوان:قلب:

plus
جمعه 04 مهر 1393, 23:36 عصر
اینطور که من فهمیدم شما میخواین "یک" شئ از نوع دیتاست رو بین همه فرمها به اشتراک بگذارین و نمیخواین از روش نه چندان اصولی استفاده از متغیر static استفاده کنید.البته توجه کنید که در هر صورت شئ شما با توجه به اینکه فقط یک instance ازش در Process ساخته میشه در هر صورت ماهیتی شبیه شئ static رو خواهد داشت، اما اگه میخواین اصولی تر کار کنید میتونید از الگوهای دیگه ای استفاده کنید.البته این دو الگویی که میگم اصلا قرار نیست با Designer سازگار باشن...Designer کلا برای این کارها مناسب نیست.
اولین الگوی جایگزین، میتونه Singleton باشه.این الگو زمانی به کار برده میشه که قراره فقط یک Instance از یک شئ ساخته بشه.
http://en.wikipedia.org/wiki/Singleton_pattern

sealed class AppDataSet : DataSet {
private static volatile AppDataSet instance;
private static object syncRoot = new Object();
private AppDataSet() {
}
public static AppDataSet Instance {
get {
if (instance == null) {
lock (syncRoot) {
if (instance == null) {
instance = new AppDataSet();
}
}
}
return instance;
}
}
}

و شما هرجا که به شئ مورد نظر احتیاج دارین از AppDataSet.Instance استفاده میکنید.البته در حقیقت این الگو فرق چندانی با متغیر static نداره ولی خوب کمی سازمان یافته تر هست.در کل استفاده از Singleton چندان توصیه نمیشه.البته در خود دات نت هم کلاس های static ی استفاده شدن که فقط یک instance از اونها وجود داره مثل System.Windows.Forms.Application .

راه حل دوم، استفاده از الگوی Context هست.در واقع شما یک کلاس به اسم AppContext خواهید داشت که زمینه کار برنامه رو در بر داره.شئ دیتاست موجود هم در این کلاس ارجاع شده و بنابرین، کلاسهایی که به AppContext دسترسی داشته باشن، به دیتاست هم دسترسی دارن.AppContext شما در فرم اصلی (با ایجاد دیتاست) ایجاد میشه و باید به طریقی به فرم های دیگه انتقال پیدا کنه.
شما گفتین از Property نمیخواین استفاده کنید.ولی خوب راه ارتباطی با یک شی یا متد هست، یا سازنده، یا Property یا مقادیر static (مثل Singleton).میتونید interface ی با نام IAppForm تعریف کنید.هر IAppForm متدی به اسم SetContext داره که برای انتقال AppContext بهش استفاده میشه.


sealed class AppContext {
private DataSet _dataSet;
public AppContext(DataSet dataSet) {
if (dataSet == null) {
throw new ArgumentNullException("dataSet");
}
_dataSet = dataSet;
}
public DataSet DataSet {
get {
return this._dataSet;
}
}
public T FormFactory<T>() where T : IAppForm, new() {
T newAppForm = new T();
newAppForm.SetContext(this);
return newAppForm;
}
}
interface IAppForm {
void SetContext(AppContext context);
}
class Form1 : Form, IAppForm {
private AppContext _context;
public void SetContext(AppContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
_context = context;
}
}
class MainForm : Form {
private AppContext _context;
private MainForm() {
DataSet dataSet = new DataSet();
// ...
// ...
_context = new AppContext(dataSet);
}
private void button1_Click(DataSet sender, EventArgs e) {
Form1 form1 = this._context.FormFactory<Form1>();
form1.ShowDialog();
}
}


پیچیده شد نه؟ :d

bita_naz
جمعه 04 مهر 1393, 23:54 عصر
پروژه من کلا خیلی کوچیک هست و برای همین از دیتابیس استفاده نکردن. کلا دو تا فرم داره که فرم دوم جدول فرم اول رو پر میکنه . همین. ولی دیتاست فرم اول در فرم دوم قایل دسترسی نیست. ( چون از نوع unTyped هست. اگر Typed Dataset بود و Schema داشت دیگه این مشکل وجود نداشت ). unTypedd دیتاست حتی اگر از نوع Public تعریف بشه باز هم بی فایدس.
یک نفر پیشنهاد داد فرم اول پروژه رو به فرم والد یا Parent تبدیل کنم و فرم دوم رو Child بذارم. اینجوری فرم Child il به دیتاست دسترسی خواهد داشت. ولی هر کاری کردم نشد.
اگر میشه در این مورد راهنمایی کنید.
باتشکر:قلب: