اینطور که من فهمیدم شما میخواین "یک" شئ از نوع دیتاست رو بین همه فرمها به اشتراک بگذارین و نمیخواین از روش نه چندان اصولی استفاده از متغیر 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