PDA

View Full Version : سوال: تعریف ایونت در فرم اصلی برای فرم ایجاد شده با کد داخل یوزر کنترل



Sal_64
سه شنبه 18 مهر 1391, 19:58 عصر
سلام- داخل یوزر کنترل بوسیله کد نویسی فرمی ایجاد میکنم مثلا فرم ff- حالا پوزر کنترل انداختم روی فرم اصلی برنامه و میخوام در فرم اصلی برنامه برای رویداد close فرم ff ایونت تعریف کنم - اما با خطای Object reference not set to an instance of an object. روبه رو میشم - ضمیمه ببینید-تشکر

MrsiLeNt
سه شنبه 18 مهر 1391, 21:08 عصر
سلام- داخل یوزر کنترل بوسیله کد نویسی فرمی ایجاد میکنم مثلا فرم ff- حالا پوزر کنترل انداختم روی فرم اصلی برنامه و میخوام در فرم اصلی برنامه برای رویداد close فرم ff ایونت تعریف کنم - اما با خطای Object reference not set to an instance of an object. روبه رو میشم - ضمیمه ببینید-تشکر
دوست عزیز کلاس فرم شما که نوشتی Form ff نمیتونه خالی باشه یعنی اجرا که میشه حتما باید new بشه
public partial class UserControl1 : UserControl
Form ff = new Form();
و مشکلتون با new کردن حل میشه

Sal_64
سه شنبه 18 مهر 1391, 22:49 عصر
سلام - تشکر- اما چرا حتی زمانیکه در رویداد لود یوزر کنترل فرم ff نیو میکردم با ز هم همین خطا میداد؟؟

Sal_64
چهارشنبه 19 مهر 1391, 17:32 عصر
سلام - اینجوری اگه به هر دلیلی بخوام فرم dispose کنم و دوباره show کنم به مشکل برمی خورم- درسته ؟

alimanam
چهارشنبه 19 مهر 1391, 20:03 عصر
با سلام

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


namespace uc_close_event
{
public partial class UserControl1 : UserControl
{
private Form frm = new Form { Text = "New Form!",
Size = new Size(300, 250),
StartPosition = FormStartPosition.CenterScreen,
TopMost = true,
ShowInTaskbar=false
};

public UserControl1()
{
InitializeComponent();
frm.FormClosed += frm_FormClosed;
}

private void button1_Click(object sender, EventArgs e)
{
frm.ShowDialog();
}

private void frm_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e)
{
MessageBox.Show("Form Closed!");
}

}


موفق باشید./

Sal_64
چهارشنبه 19 مهر 1391, 20:46 عصر
سلام - تشکر- ببینید من میخوام رویداد close فرم ff در داخل فرم اصلیم داشته باشم - الان موضوع بحث محل new کردن فرم ff بصورتیکه بشه بعد از dispose شدن دوباره show کرد - تشکر

alimanam
چهارشنبه 19 مهر 1391, 21:08 عصر
با سلام


سلام - تشکر- ببینید من میخوام رویداد close فرم ff در داخل فرم اصلیم داشته باشم - الان موضوع بحث محل new کردن فرم ff بصورتیکه بشه بعد از dispose شدن دوباره show کرد - تشکر

در فرم اصلی برنامه ( Form1 ) نیازی به کدنویسی خاصی نیست . کدهای یوزر کنترل رو به شکل زیر تغییر بدین :


public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();

}
private void frm_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e)
{
MessageBox.Show("Form Closed!");
}
private void button1_Click(object sender, EventArgs e)
{

Form frm = new Form { Text = "New Form!",
Size = new Size(300, 250),
StartPosition = FormStartPosition.CenterScreen,
TopMost = true,
ShowInTaskbar=false
};
frm.FormClosed += frm_FormClosed;
frm.ShowDialog();
}
}


موفق باشید./

Sal_64
چهارشنبه 19 مهر 1391, 21:35 عصر
باز هم تشکر - کدهای شما استفاده کردم - اما من به رویداد close فرم ff در فرم اصلی برنامم نیاز دارم - شما نمونه برنامه ببینید- تشکر

alimanam
چهارشنبه 19 مهر 1391, 21:39 عصر
با سلامی دوباره

دوست خوبم شما اگر اطلاعات بهتری از این نیاز به رویداد مذکور در فرم اصلی برنامه دارین بگین بهتر میشه کمکتون کرد لطفاً در نظر داشته باشین به راحتی میشه نیازتون رو در سطح کلاس یوزر کنترلی که مینویسین مرتفع کنین و نیازی نیست که حتماً در فرم اصلی بهش دسترسی داشته باشید ./

موفق باشید./

Sal_64
چهارشنبه 19 مهر 1391, 22:01 عصر
سلام - ببینید من روی فرمم دو تا یوزر کنترل دارم قراره در زمانیکه فرم ff مربوط به یوزر کنترل اول بسته میشه اطلاعاتی به یوزر کنترل دوم بفرسته

morteza271
چهارشنبه 19 مهر 1391, 22:28 عصر
به نظرم مسئله رو سخت کردین دوستان.

پروژه ی ضمیمه رو بررسی کنید ببینید همونی هست که میخواین یا نه؟!
البته روشهای دیگه ای داره ولی فعلا روشی که توی پروژه هست رو پیاده کردم.
93821
موفق باشید

alimanam
چهارشنبه 19 مهر 1391, 22:39 عصر
بازم سلام

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


سلام - ببینید من روی فرمم دو تا یوزر کنترل دارم قراره در زمانیکه فرم ff مربوط به یوزر کنترل اول بسته میشه اطلاعاتی به یوزر کنترل دوم بفرسته

قراره این اطلاعات به یوزر کنترل شما پاس داده بشه یا آبجکت فرمی که در یوزر کنترل میسازین ؟ این دوتا با هم فرق میکنه و هر کدوم یه سطحی دارن .

موفق باشید./

Sal_64
چهارشنبه 19 مهر 1391, 22:45 عصر
torski عزیز تشکر- اما خب بهتر نیست همه چیز داخل یوزر کنترل بنویسم که بعد به هر تعداد خواستم روی فرمهام قرار بدم و تنها با یک خط کد در فرم اصلی ازشون استفاده کنم- بازم ممنون

Sal_64
چهارشنبه 19 مهر 1391, 22:57 عصر
alimanam عزیز - اگه بدونم منظور شما از آبجکت فرم چیه احتمالا بهتر بتونم جواب بدم - ببینید در یوزر کنترل اول کارهایی انجام میشه که نتیجه حاصل از اون در رویداد بسته شدن ff به وساطتت فرم اصلی (set/get) به یوزر کنترل دوم فرستاده میشه - از اونجایی که یوزر کنترل دوم هم مکررا در باقی فرم ها استفاده میشه و نیازی به همراهی با یوزر کنترل اول نداره به همین دلیل اونها در یک یوزر کنترل با هم ادغام نکردم - اگه توضیحات بیشتری نیازه - بگید - بازم تشکر

morteza271
چهارشنبه 19 مهر 1391, 23:01 عصر
شرمنده من نمیدونستم چه قصدی دارین!
کاش همیشه از اول اینقد توضیح بدین تا اینطوری نشه.
من این مثال رو برای رفع مشکلتون که نمیدونستم چی هست زدم!
اینطوری که شما میخواین ازش استفاده کنید! به نظرم روش مناسبی براش نیست(چون قراره بارها و در فرم های زیاد از این یوزرکنترل استفاده کنید) وگرنه روش هست که اصلا درست و منطقی نیست!

پس شما یه لطفی کن و بگو دقیقا هدفت از این کار چیه؟واسه چی میخوای یه فرم جدید باز کنی و بعد وقتی بسته میشه یه کاری انجام بدی؟
اینو توضیح بده تا بهت بگم چیکار کنی؟؟
منم از این جور کارها زیاد داشتم ولی همیشه خیلی راحت تر درست شون کردم!

Sal_64
پنج شنبه 20 مهر 1391, 18:44 عصر
torski عزیز - تشکر که پیگیرید -توضیح برنامه طولانی - مشکل من با پست دوم حل شده - و سوال من پست سوم

morteza271
پنج شنبه 20 مهر 1391, 19:51 عصر
آهان حالا متوجه شدم!شرمنده دقیق نخونده بودم پست هاتون رو!!!!!!

ولی با اون روشی که رفتین طبق حرف خودتون دیگه نمیتونین فرم ff رو Dispose کنید چراکه با اینکار دیگه رویداد Closed فرم ff در فرم اصلی عمل نمیکنه!
فکر کنم با شرایطی که شما دارین نباید شما فرم رو Dispose کنید و بهتره که کد زیر رو در رویداد سازنده یوزکنترل بذارید :
ff = new Form();

روش دیگه ای هم به ذهنم میرسه ولی چون میخواین در فرم های زیادی ازش استفاده کنید مناسب نیست!!!

شما نمیتونید کاری که قراره در فرم اصلی یا هر فرمی که از این یوزر کنترل استفاده میشه، انجام بشه رو به صورت یک تابع عمومی در آورید؟؟!!

ولی فک کنم بهتر باشه روشتون رو عوض کنید.
موفق باشید

Sal_64
پنج شنبه 20 مهر 1391, 20:10 عصر
سلام -تشکر- این برنامه بازگردان یه برنامه دیگست و بصورتیه که شیوه دیگه ای نمیشه در موردش بکار برد - بهر صورت تشکر

Sal_64
سه شنبه 25 مهر 1391, 15:57 عصر
سلام -داخل همون کد - با "بک گراند ورکر" به مشکل بر خوردم - بصورتیکه اگر پشت سر هم فرم دو مرتبه نمایش داده (show) بشه و بسته شه خطا می دهد - لطفا نمونه ضمیمه شده ببینید - تشکر

Sal_64
پنج شنبه 27 مهر 1391, 13:50 عصر
حتی یکبار هم ضمیمه دانلود نشده :-((((

morteza271
پنج شنبه 27 مهر 1391, 14:07 عصر
دوست عزیز واقعا من دیگه عقلم به جایی نمیرسه!!!
شما بگین داخل این رویداد میخواین چیکار کنین :
private void ff_FormClosed(object sender, FormClosedEventArgs e)
{
// MessageBox.Show("گولا");
}

شاید بشه روش دیگه ای رو پیاده کرد!!!
وگرنه با این روشی که دارین به نظرم نمیشه کاریش کرد!!!!!!!!

Sal_64
جمعه 28 مهر 1391, 23:25 عصر
توضیحش طولانیه -اما کلایتش این میشه که قرار در یک uc با زدن دکمه اطلاعات در یک bgw از بانک گرفته و در یک dgv سفارشی شده در داخل فرم ff نمایش داده بشه و سپس با انتخاب یک رکورد فرم بسته شده و در رویداد close همون فرم اطلاعات به یک uc دیگه منتقل بشه- و اما یک مطلب دیگه من در فرم اصلیم نمیتونم به parent یوزرکنترل فراخواننده رویداد close فرم ff برای تشخیص اینکه این رویداد مربوط به کدام uc دسترسی داشته باشم - بنظر شما چه شکلی باید uc فراخواننده مشخص کرد؟؟ تشکر

morteza271
شنبه 29 مهر 1391, 13:01 عصر
توضیحش طولانیه -اما کلایتش این میشه که قرار در یک uc با زدن دکمه اطلاعات در یک bgw از بانک گرفته و در یک dgv سفارشی شده در داخل فرم ff نمایش داده بشه و سپس با انتخاب یک رکورد فرم بسته شده و در رویداد close همون فرم اطلاعات به یک uc دیگه منتقل بشه- و اما یک مطلب دیگه من در فرم اصلیم نمیتونم به parent یوزرکنترل فراخواننده رویداد close فرم ff برای تشخیص اینکه این رویداد مربوط به کدام uc دسترسی داشته باشم - بنظر شما چه شکلی باید uc فراخواننده مشخص کرد؟؟ تشکر

من توصیه میکنم به جای استفاده از UserControl از Ballonهای کامپوننت دات نت بار استفاده کنید.
طبق توضیحاتی که شما دادین به نظرم از بالن ها استفاده کنید بهتره من خودم همیشه در پروژه هام برای کارهای مشابه کار شما از بالن ها استفاده میکنم که به نظرم خیلی بهتر از userControl هست.

موفق باشید

Sal_64
شنبه 29 مهر 1391, 15:08 عصر
تشکر - میشه یه نمونه برنامه کوچیک اینجا بذارید ؟- و اما یک مطلب دیگه من در فرم اصلیم نمیتونم به parent یوزرکنترل فراخواننده رویداد close فرم ff برای تشخیص اینکه این رویداد مربوط به کدام uc دسترسی داشته باشم - بنظر شما چه شکلی باید uc فراخواننده مشخص کرد؟؟ تشکر

morteza271
شنبه 29 مهر 1391, 19:06 عصر
این یه نمونه پروژه برای استفاده از بالن های دات نت بار هستش.
ببینید که این کارتون رو را میندازه یا نه ...
94190

البته اینم فایل dll دات نت بار هستش اینو توی پوشه دیباگ کپی کنین تا اجرا شه :
http://up.toca.ir/images/bvse0bgpx8jriidv3tz.rar

موفق باشید