نمایش نتایج 1 تا 8 از 8

نام تاپیک: اطلاع از رخداد یک Event به پنجره بالا دستی (Parent)

  1. #1
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    Red face اطلاع از رخداد یک Event به پنجره بالا دستی (Parent)

    سلام
    اینطور فرض کنید که یک یوزرکنترل را به فرم(پنجره) اضافه کردیم ، و حالا داخل فرم نیاز داریم متوجه شویم که فلان رویداد آیا در یوزر کنترل به وقوع پیوسته است یا خیر که همزمان با آن کاری را در پنجره اصلی انجام دهیم

    مثلا : در فرم میخواهیم متوجه شویم که آیا رویداد کلیک بر روی باتم در یوزرکنترل اتفاق افتاده یا خیر

    با فرض اینکه نباید رویداد مربوط به یوزر کنترل را در داخل فرم اصلی تعریف کنیم

    امیدوارم توضیحاتم کافی بوده باشه

    تشکر

  2. #2
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: اطلاع از رخداد یک Event به پنجره بالا دستی (Parent)

    راه هایی هست اما راه منطقی به نظر همون تعریف یک رویداد در UserControl و Raise کردن اون هنگام کلیک دکمه و استفاده از رویداد UserControl در فرم پدرهست:

    public Form1 : Form
    {
    public Form1()
    {
    InitializeComponents();
    userControl11.SomeButtonClicked += new EventHandler(userControl11_someButtonClicked); // Subscribe

    }
    private userControl11_someButtonClicked(object sender, EventArgs e)
    {
    MessageBox.Show("SomeButton on usercontrol is clicked!");
    }
    ///
    }

    public UserControl1: UserControl
    {
    public event EventHandler SomeButtonClicked;

    public UserControl1()
    {
    InitializeComponents();
    this.SomeButton.Click += new EventHandler(someButton_Click);
    }
    private userControl11_someButtonClick(object sender, EventArgs e)
    {
    if (this.SomeButtonClicked != null)
    this.SomeButtonClicked(this, EventArgs.Empty);
    }
    }

    شما اگه نخواین از Event برای این کار استفاده کنین، میتونید به یه نحو دیگه الگوی Observer رو پیاده کنید ولی نتیجه شبیه همین خواهد بود.
    البته اگه میخواین که فرم به صورت مستقیم نقش Observer رو ایفا نکنه راه های دیگه ای هم هست.مثلا:

    public interface ISomeButtonClickReceiver
    {
    void SomeButtonClicked();
    }
    public Form1 : Form, ISomeButtonClickReceiver
    {
    public SomeButtonClicked()
    {
    MessageBox.Show("SomeButton is clicked!");
    }
    }
    public UserControl1: UserControl
    {
    public UserControl1()
    {
    InitializeComponents();
    this.SomeButton.Click += new EventHandler(someButton_Click);
    }
    private userControl11_someButtonClick(object sender, EventArgs e)
    {
    if (this.Parent is ISomeButtonClickReceiver)
    ((ISomeButtonClickReceiver)this.Parent).SomeButton Clicked();
    }
    }

  3. #3
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اطلاع از رخداد یک Event به پنجره بالا دستی (Parent)

    سلام
    تشکر
    آیا این امکان وجود داره که از داخل یوزر کنترل ،پس از وقوع یک رخداد با دستور Parent.Invoke و یا دستور مشابه رویداد خاصی را در parent فراخوانی کرد ؟

  4. #4
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: اطلاع از رخداد یک Event به پنجره بالا دستی (Parent)

    از اونجا که در حالت عادی رویداد UI مربوط به UserControl در همون Thread ی اجرا میشه که Parent اون اجرا میشه، استفاده از Invoke کار خاصی رو در این مورد انجام نمیده.ولی با استفاده از Reflection میشه کارهایی رو انجام داد. (اینجا رو ببینید) و یا اینکه اگه رویداد مروبط به User Interface هست با استفاده از Windows API و ارسال Message مناسب رویداد مورد نظر رو Raise کرد.ولی هر دوی این راه ها کلا راه مناسب نیستن.چون صورت مساله غلط هست. راه حل عادی همون تعریف Event هست.شما اگه مساله ای که دارین رو کامل تر مطرح کنید شاید راه حل صحیح رو پیدا کنید..

  5. #5
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اطلاع از رخداد یک Event به پنجره بالا دستی (Parent)

    ببینید در یوزرکنترل با کلیک روی باتم یکسری عملیات انجام میشه و حاصل اون به صورت datatable در میاد ، بلافاصله باید اون دیتاتیبل در فرم اصلی مورد استفاده قرار بگیره

  6. #6
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: اطلاع از رخداد یک Event به پنجره بالا دستی (Parent)

    خوب همون سناریوی تعریف Event که اول گفتم برای این نیاز پاسخگو هست.برای ارائه DataTable به فرم، یک راه تعریف یک Property در UserControl هست:

    public Form1 : Form
    {
    public Form1()
    {
    InitializeComponents();
    userControl11.SomeButtonClicked += new EventHandler(userControl11_someButtonClicked); // Subscribe

    }
    private userControl11_someButtonClicked(object sender, EventArgs e)
    {
    DataTable data = userControl11.Data;
    // Do whatever with data...
    }
    }

    public UserControl1: UserControl
    {
    public event EventHandler SomeButtonClicked;
    private DataTable data;

    public UserControl1()
    {
    InitializeComponents();
    this.SomeButton.Click += new EventHandler(someButton_Click);
    }
    private userControl11_someButtonClick(object sender, EventArgs e)
    {
    // Do caluclations
    // ...
    this.data = [Result Data Table];
    if (this.SomeButtonClicked != null)
    this.SomeButtonClicked(this, EventArgs.Empty);
    }
    public DataTable Data
    {
    get { return this.data; }
    }
    }

    و یا اگه DataTable مورد نظر مسقیما با رویداد در ارتباط میتونید اون رو به عنوان آرگومان رویداد به فرم ارسال کنید:

    // Define event args
    public SomeButtonClickedEventArgs : EventArgs
    {
    private DataTable data;
    public SomeButtonClickedEventArgs(DataTable data)
    {
    this.data = data;
    }
    public DataTable Data
    {
    get { return this.data;}
    }
    }

    // Define event handler
    public delegate void SomeButtonClickedEventHandler(object sender, SomeButtonClickedEventArgs e);

    //
    public Form1 : Form
    {
    public Form1()
    {
    InitializeComponents();
    userControl11.SomeButtonClicked += new SomeButtonClickedEventHandler(userControl11_someBu ttonClicked); // Subscribe

    }
    private userControl11_someButtonClicked(object sender, SomeButtonClickedEventArgs e)
    {
    DataTable data = e.Data;
    // Do whatever with data...
    }
    }

    public UserControl1: UserControl
    {
    public event SomeButtonClickedEventHandler SomeButtonClicked;

    public UserControl1()
    {
    InitializeComponents();
    this.SomeButton.Click += new EventHandler(someButton_Click);
    }
    private userControl11_someButtonClick(object sender, SomeButtonClickedEventArgs e)
    {
    // Do caluclations
    // ...
    DataTable data = [Result Data Table];
    SomeButtonClickedEventArgs ea = new SomeButtonClickedEventArgs(data);

    if (this.SomeButtonClicked != null)
    this.SomeButtonClicked(this, ea);
    }

    }

  7. #7
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اطلاع از رخداد یک Event به پنجره بالا دستی (Parent)

    تشکر بابت وقتی که گذاشتی
    اگه مثله کنترل های فرم والد به توابع هم میشد دسترسی مستقیم داشت ، در این کار حجم کد نویسی به شدت پایین می اومد

  8. #8
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اطلاع از رخداد یک Event به پنجره بالا دستی (Parent)

    بنده روش دیگه ای اجرا کردم
    ایونت کلیک باتم داخل یوزر کنترل کارها انجام میده و دیتاتیبل تولید میکنه
    سپس مجدد همون ایونت داخل فرم هم تعریف کردم که با متد GET کارش فقط گرفتن دیتاتیبل ایجاد شده از یوزر کنترل
    سرجمع 3 -4 خط کد نویسی اضافه

    حالا سوالم از دوستان اینه که آیا این شیوه درسته

تاپیک های مشابه

  1. سوال: فراخوانی event ها به صورت دستی
    نوشته شده توسط beni.com در بخش C#‎‎
    پاسخ: 7
    آخرین پست: سه شنبه 26 اردیبهشت 1391, 15:55 عصر
  2. سوال: رخداد نویسی event
    نوشته شده توسط ali.hojjati در بخش VB.NET
    پاسخ: 1
    آخرین پست: شنبه 10 اسفند 1387, 19:59 عصر
  3. حذف منوی بالا در پنجره pupoup
    نوشته شده توسط morteza_lll در بخش طراحی وب (Web Design)
    پاسخ: 5
    آخرین پست: یک شنبه 08 مهر 1386, 10:00 صبح
  4. حذف منوی بالا در پنجره pupoup
    نوشته شده توسط morteza_lll در بخش ASP.NET Web Forms
    پاسخ: 3
    آخرین پست: شنبه 07 مهر 1386, 16:00 عصر
  5. چگونه قرار دادن یک پنجره در بالا تر از همه فرم ها (با استفاد
    نوشته شده توسط hamedahmed در بخش برنامه نویسی در Delphi
    پاسخ: 7
    آخرین پست: یک شنبه 09 اسفند 1383, 09:34 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •