انتقال یک متغیر بین دو فرم در #c

m_mx2009

Member
سلام خدمت همه دوستان

بنده یک فرم Parent ساختم و یک فرم Child...میخوام با کلیک کردن بر روی یک Button در فرم Child یک متغیر در فرم Parent مقدار دهی بشه...یعنی مثلا مقدار یک متغیر از فرم Child به یک متغیر دیگه در فرم Parent کپی بشه...
چطور میتونم این کارو بکنم...
داخل انجمن سرچ کردم ولی اونا یک فرم جدید میساختند در حالی که فرم Parent اول کار ساخته میشه...میخوام یک روشی باشه که بتونم فرم ساخته شده رو پیدا کنم...
ممنون میشم راهنمایی کنید ...:rose:
 

the_king

مدیرکل انجمن
سلام خدمت همه دوستان

بنده یک فرم Parent ساختم و یک فرم Child...میخوام با کلیک کردن بر روی یک Button در فرم Child یک متغیر در فرم Parent مقدار دهی بشه...یعنی مثلا مقدار یک متغیر از فرم Child به یک متغیر دیگه در فرم Parent کپی بشه...
چطور میتونم این کارو بکنم...
داخل انجمن سرچ کردم ولی اونا یک فرم جدید میساختند در حالی که فرم Parent اول کار ساخته میشه...میخوام یک روشی باشه که بتونم فرم ساخته شده رو پیدا کنم...
ممنون میشم راهنمایی کنید ...:rose:

برای فرم Child کار خاصی لازم نیست انجام بشه چون کد رو داخل همون کلاس اجرا می کنید و مشکلی برای دسترسی نیست.
اما برای ساختن متغیر در فرم Parent دو راه حل کلی پیشنهاد می کنم. یا متغیر static تعریف کنید و یا متغیر non-static که بشه
از این دو طریق مقدار رو از طریق فرم Child یا هر کلاس دیگری دریافت کنه. فرض کنیم که کلاس فرم Parent تون Form1 باشه.

روش اول : متغیر static بسازید
در داخل کلاس فرم Parent تون که فرضا Form1 است، یک متغیر public static به نام x تعریف می کنیم :
کد:
[COLOR="#A9A9A9"]    public partial class Form1 : Form
    {
[/COLOR]        public static int x = 0;

[COLOR="#A9A9A9"]        public Form1()
        {
            InitializeComponent();
        }
[/COLOR]

حالا در کلاس فرم Child تون یا هر کلاس دیگری، این متغیر توسط نام Form1.x قابل دسترسی است. دقت کنید که از آنجایی که این متغیر static است، Form1 نام متغیر نیست،
نام کلاس است. از x فقط و فقط صرفا یک نمونه وجود دارد که همیشه قابل دسترسی است و ربطی هم با تعداد نمونه های فرم Form1 که ایجاد شده ندارد.
کد:
[COLOR="#A9A9A9"]        private void button1_Click(object sender, EventArgs e)
        {
[/COLOR]            Form1.x = 12;
[COLOR="#A9A9A9"]        }[/COLOR]

روش دوم : متغیر non-static بسازید
در داخل کلاس فرم Parent تون که فرضا Form1 است، یک متغیر public به نام x تعریف می کنیم :
کد:
[COLOR="#A9A9A9"]    public partial class Form1 : Form
    {
[/COLOR]        public int x = 0;

[COLOR="#A9A9A9"]        public Form1()
        {
            InitializeComponent();
        }
[/COLOR]

حالا در کلاس فرم Child تون یا هر کلاس دیگری، ابتدا شیء ای که از فرم Form1 ایجاد شده و در حال نمایش است را پیدا می کنیم. این شیء با کدی
شبیه به کد زیر پیدا می شود :
کد:
            Form1 f1 = (Form1)Application.OpenForms["Form1"];

در بدنه کلاس هایی که فرم نیستند، برای دسترسی به Application یا باید System.Windows.Forms را ابتدا using کنید و یا System.Windows.Forms را به کد اضافه کنید :
کد:
            Form1 f1 = (Form1)System.Windows.Forms.Application.OpenForms["Form1"];

حالا که شیء پیدا شد، متغیر x در آن شیء قابل دسترسی است :
کد:
[COLOR="#A9A9A9"]        private void button1_Click(object sender, EventArgs e)
        {
[/COLOR]            Form1 f1 = (Form1)Application.OpenForms["Form1"];
            f1.x = 12;
[COLOR="#A9A9A9"]        }[/COLOR]

دقت کنید که از آنجایی که این متغیر non-static است، f1 نام یک شیء معتبر و ایجاد شده از فرم Form1 است و تعداد x ها به تعداد نمونه های فرم Form1 بستگی دارد.
اگر به هر دلیلی این شیء قابل دسترسی نباشد، متغیر x ای هم وجود نخواهد داشت.
 

m_mx2009

Member
نمیدونم چجوری تشکر کنم...دو روزه که دارم سایتای داخلی و خارجی رو زیر و رو میکنم ولی هیچ کدومشون جوابی به این کاملی و قشنگی نذاشته بودند....
واقعا ممنونم...لطف کردید....:rose::rose::rose:
 

alirezador

New Member
سلام مدیر عزیز به نظر شما به جای دستور زیر
PHP:
 (Form1)Application.OpenForms["Form1"]
استفاده از سازنده کلاس فرزند و ارسال یک نمونه از فرم یک به داخل اون نیست.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام مدیر عزیز به نظر شما به جای دستور زیر
PHP:
 (Form1)Application.OpenForms["Form1"]
استفاده از سازنده کلاس فرزند و ارسال یک نمونه از فرم یک به داخل اون نیست.

صرفا سادگی درک ;()new Form1 کافی نیست، new یک شیء جدید می سازه. یک فرم Form1 ای که باز و در حال نمایش ئه شیء ای مستقل از بقیه Form1 ها است،
مقادیری که فرضا در داخل TextBox هایش نوشته میشه در ()new Form1 قابل دسترسی نخواهد بود.
 

جدیدترین ارسال ها

بالا