PDA

View Full Version : مشکل در رفرش کردن یک فرم از داخل فرم دیگر



adineh67
دوشنبه 10 آذر 1393, 17:23 عصر
سلام
تو فرم اصلی وقتی دکمه ی ویرایش رو میزنم یه فرم دیگه مخصوص ویرایش باز میشه و در کنارش فرم اصلی هم باز هست وقتی ویرایشو انجام دادم و دکمه ثبت رو زدم پنجره ویرایش بسته میشه میخوام همزمان با بسته شدن فرم ویرایش ، اطلاعات فرم اصلی رفرش بشن.
تو رویداد بسته شدن فرم ویرایش کد زیر رو نوشتم ولی جواب نمیده:


private void EditSegment_FormClosing(object sender, FormClosingEventArgs e)
{
Segment frmseg = new Segment();
frmseg.Refresh();
}

rasoolf
دوشنبه 10 آذر 1393, 17:39 عصر
شما با اینکار دارین یک نمونه از کلاس فرم Segment می سازید و اون نمونه(instance) را refresh می کنید. یه راه برای refresh کردن فرم کد زیره



foreach (Form item in Application.OpenForms)
{
if (item.Name == "Segment")
item.Refresh();
}

mojtabamalaekeh
دوشنبه 10 آذر 1393, 17:58 عصر
من همیشه یه متغیر سراسری میذارم برای فرم اصلی

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new MainForm());
}

public static MainForm pubMain = null;
}


و موقع بالا اومدن فرم اصلی بهش مقدار میدم:

public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
Program.pubMain = this;
}

public void UpdateDynamicParts()
{
//code
}


برای رفرش شدن هم یه متد public توی فرم اصلی میذارم که قسمت های مورد نیاز فرم اصلی رو به روز کنه که توی کد بالا میبینیش.

اینم فراخوانیش:

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Program.pubMain.UpdateDynamicParts();
}



توی کد rasoolf هم بعد از پیدا کردن item میتونی به نوع فرم اصلیت تبدیلش کنی تا اگر مثل من متد سراسری توش تعریف شده باشه بهش دسترسی پیدا کنی چون همینجوریش از نوع Form هست و متدهایی که خودمون اضافه کردیم معنی نمیدن!


((MainForm)item).UpdateDynamicParts();

adineh67
دوشنبه 10 آذر 1393, 18:04 عصر
شما با اینکار دارین یک نمونه از کلاس فرم Segment می سازید و اون نمونه(instance) را refresh می کنید. یه راه برای refresh کردن فرم کد زیره



foreach (Form item in Application.OpenForms)
{
if (item.Name == "Segment")
item.Refresh();
}


این کد رو کجا باید گذاشت ؟!

adineh67
دوشنبه 10 آذر 1393, 18:08 عصر
ممنون از همگی:لبخندساده:

rasoolf
دوشنبه 10 آذر 1393, 18:13 عصر
این کد رو کجا باید گذاشت ؟!

هرجایی که نیاز داری فرم را refresh کنی مثلاً داخل رویداد closing مربوط به فرم 2.

http://barnamenevis
دوشنبه 10 آذر 1393, 18:26 عصر
چه کاریه این همه وقتی فرم ویرایشو میبندید یه instance جدید از فرم اصلی بسازید..همین باعث میشه همه داداها رفرش بشن..

adineh67
دوشنبه 10 آذر 1393, 18:31 عصر
این کد رو نوشتم ولی جواب نداد


private void EditSegment_FormClosed(object sender, FormClosedEventArgs e)
{
foreach (Form item in System.Windows.Forms.Application.OpenForms)
{
if (item.Name == "Segment")
item.Refresh();
}
}

mojtabamalaekeh
دوشنبه 10 آذر 1393, 18:42 عصر
چه کاریه این همه وقتی فرم ویرایشو میبندید یه instance جدید از فرم اصلی بسازید..همین باعث میشه همه داداها رفرش بشن..
توی پست اول گفتن دلیلش رو.
مثل برنامه های تمام صفحه که فرم اصلی از اول اجرا تا آخرش جلو چشم کاربره و نمیشه هی باز و بسته اش کرد.


این کد رو نوشتم ولی جواب نداد
آیا بجای "Segment" خاصیت Name فرم اصلی رو گذاشتین؟
اصلا کار شما با Refresh فرم راه میفته؟ اون چیزی که میخواین رفرش بشه چیه؟ مثلا ظاهر فرمه یا یه Label یا... ؟

http://barnamenevis
دوشنبه 10 آذر 1393, 18:42 عصر
رو فرم اصلی چی می خوای رفرش کنی ؟

adineh67
دوشنبه 10 آذر 1393, 18:46 عصر
رو فرم اصلی چی می خوای رفرش کنی ؟

گریدویومو میخوام رفرش کنم

adineh67
دوشنبه 10 آذر 1393, 18:48 عصر
آیا بجای "Segment" خاصیت Name فرم اصلی رو گذاشتین؟
اصلا کار شما با Refresh فرم راه میفته؟ اون چیزی که میخواین رفرش بشه چیه؟ مثلا ظاهر فرمه یا یه Label یا... ؟[/QUOTE]

بله Segment همون اسم فرمم هست و میخوام گریدویو والبته یه لیبل واسم رفرش شه

mojtabamalaekeh
دوشنبه 10 آذر 1393, 18:53 عصر
میخوام گریدویو والبته یه لیبل واسم رفرش شه
پس یه متد سراسری توی فرم اصلی تعریف کنید مثل همون UpdateDynamicParts پست 3
چرا؟ چون نه گرید نه لیبل، با Refresh نمیفهمن چیکار باید بکنن :بامزه:
گرید یا باید دوباره بهش دیتاسورس بدی یا برا کاربرپسند بودن برنامت، فقط سلول های اون ردیف که توی فرم Edit دستکاری شده رو به روز کنی.
Label هم که خودت میدونی محتواش چیه و چه کدی برا بروزرسانیش لازمه.

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

adineh67
دوشنبه 10 آذر 1393, 19:03 عصر
پس یه متد سراسری توی فرم اصلی تعریف کنید مثل همون UpdateDynamicParts پست 3
چرا؟ چون نه گرید نه لیبل، با Refresh نمیفهمن چیکار باید بکنن :بامزه:
گرید یا باید دوباره بهش دیتاسورس بدی یا برا کاربرپسند بودن برنامت، فقط سلول های اون ردیف که توی فرم Edit دستکاری شده رو به روز کنی.


Bravo:تشویق:

rasoolf
دوشنبه 10 آذر 1393, 19:05 عصر
آیا بجای "Segment" خاصیت Name فرم اصلی رو گذاشتین؟
اصلا کار شما با Refresh فرم راه میفته؟ اون چیزی که میخواین رفرش بشه چیه؟ مثلا ظاهر فرمه یا یه Label یا... ؟
بله Segment همون اسم فرمم هست و میخوام گریدویو والبته یه لیبل واسم رفرش شه


دوست عزیز کدی که گفتم درست کارمیکنه برای اینکه مطمئن بشید کافیه برنامه را خط به خط اجرا کنی(Trace).
ولی همونطور که دوستمون mojtabamalaekeh گفتن شما برای بروز کردن گریدویو باید اون را به روز رسانی کنی وبرای کمک بیشتر میتونی کدت رو اینجا قرار بدی تا بچه ها بتونن راهنماییت کنن

http://barnamenevis
دوشنبه 10 آذر 1393, 19:11 عصر
توی فرم اصلیت یه تابع تعریف کن واسه رفرش گریدوبو..

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

میتونی از سورس های زیر استفاده کنی

کد فرم 1


using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace parenrchild
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Form2 child = new Form2(this);
child.Show();
}

public void re()//تابع نمایش زمان داخل لیبل
{
label1.Text = DateTime.Now.ToString();
}
}
}


کد فرم 2



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace parenrchild
{
public partial class Form2 : Form
{
Form1 _owner;
public Form2(Form1 owner)
{
_owner = owner;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
_owner.re();
}

}
}