PDA

View Full Version : متوجه شدن تغیرات داده در یک تب



ebrahim.rayatparvar
شنبه 02 خرداد 1394, 20:46 عصر
سلام دوستان.
اول کمی موضوعی رو که میخوام رو شرح میدم تا دوستان خوبمون به من کمک کنند.
در همه برنامه ها بخشی دارم برای تنظیمات حتی در برنامه های ویندوزی هم دیده میشه مثلا خود ویندوز فکر کنید وار یه تنظیمات میشین فرم تنظیمات تشکیل شده از چند تب حالا زمانی که دکمه OK رو زدین همه تنظیمات دخیره میشه.
حالا من تعداد تب های من در طول طراحی برنامه زیاد میشه و کنترل های زیاذی داخلش وجود داره.

میخوام بدونم چه راه حلی وجود داره که من اگه از 5 تا تب فقط 2تا تب رو تنظیماتش رو دست زدم همین 2تا تب رو بفرستم برای ذخیره شدن نه اینکه تمام مقدار کنترل ها رو دوباره بفرستم برای ذخیره کردن.

Mahmoud Zaad
شنبه 02 خرداد 1394, 21:13 عصر
سلام
شما برای هر تب یه متغیر بولین داشته باشید که در ابتدا False باشه، حالا هر تغییری در تب ایجاد شد متغیر مرتبطش True بشه، با بررسی متغیرهایی که True هستند میشه فهمید کدوم تب تغییرات داشته.

ebrahim.rayatparvar
شنبه 02 خرداد 1394, 23:56 عصر
یعنی تنها راه حل همینه چون برای اینکار فعلا یه متغیر دارم که اگه در تبی مقدار یکی از کنترل ها تغییر مقدار متغیر من تغییر می کنه برای هر تب یه متغیر جدا به غیر این هیچ راه حل بهینه ای ظاهرا وجود نداره.

Mahmoud Zaad
یک شنبه 03 خرداد 1394, 09:33 صبح
شما همین ویژوال استودیو رو هم نگاه کنید وقتی یکی از تبها تغییرات دارن یه ستاره بغل اسمش میاد. شاید از این طریق هم بشه. البته چون تب ها مرتباً باز و بسته میشن، میشه یه لیست List استاتیک در یه کلاسی تعریف کرد و در هر تبی که تغییری اتفاق می افته نام تب رو در اون لیست ذخیره کرد و ...

golbafan
یک شنبه 03 خرداد 1394, 09:52 صبح
یک خاصیتی برای کنترل ها هست به نام modified که وقتی true میشه یعنی اون کنترل رو ویرایش کردید

https://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.modifiedchanged%2 8v=vs.110%29.aspx

Javad_raouf
یک شنبه 03 خرداد 1394, 12:04 عصر
یک خاصیتی برای کنترل ها هست به نام modified که وقتی true میشه یعنی اون کنترل رو ویرایش کردید

چیز خوبیه ولی این فقط برای Textbox وجود داره
-------------
نظر من:
فرض می کنیم که توی تنظیماتت از سه نوع کنترل استفاده کردی: TextBox، CheckBox، ComboBox
یک تابع به شکل زیر تعریف کن:
public List<Control> lstControlChanged = new List<Control>();
void ControlValueChanged(object sender, EventArgs e)
{
lstControlChanged.Add((Control)sender);
}
این دو تا تابع استاتیک رو هم هر جا دلت خواست تعریف کن:
public static bool IsKindOfType(Type Type, Type BaseType)
{
Type CounterType = Type;
while (CounterType != null)
{
if (CounterType == BaseType)
return true;
CounterType = CounterType.BaseType;
}
Type[] allInterfaces = Type.GetInterfaces();
foreach (Type InType in allInterfaces)
if (InType == BaseType)
return true;
return false;
}

public static List<Control> GetAllSubControls(Control Ctl, params Type[] BaseTypes)
{
if (BaseTypes == null || BaseTypes.Length == 0)
BaseTypes = new Type[1];
for (int i = 0; i < BaseTypes.Length; i++)
if (BaseTypes[i] == null)
BaseTypes[i] = typeof(Control);
List<Control> lstCont = new List<Control>();
foreach (Control x in Ctl.Controls)
lstCont.Add(x);
for (int i = 0; i < lstCont.Count; i++)
foreach (Control x in lstCont[i].Controls)
lstCont.Add(x);
for (int i = lstCont.Count - 1; i >= 0; i--)
{
bool blnOk = false;
foreach (Type BType in BaseTypes)
if (IsKindOfType(lstCont[i].GetType(), BType))
{
blnOk = true;
break;
}
if (!blnOk)
lstCont.RemoveAt(i);
}
return lstCont;
}

حالا توی فرم لود این کد رو بنویس:
List<Control> AllTextBox = fn.GetAllSubControls(this, typeof(TextBox));
List<Control> AllCheckBox = fn.GetAllSubControls(this, typeof(CheckBox));
List<Control> AllComboBox = fn.GetAllSubControls(this, typeof(ComboBox));
foreach (Control x in AllTextBox)
((TextBox)x).TextChanged += ControlValueChanged;
foreach (Control x in AllCheckBox)
((CheckBox)x).CheckedChanged += ControlValueChanged;
foreach (Control x in AllCheckBox)
((ComboBox)x).SelectedIndexChanged += ControlValueChanged;
بقیش هم که معلومه دیگه
موقع Save کردن فقط کنترل هایی رو Save کن که در لیست lstControlChanged قرار دارند


البته شاید راه اصولی تری هم وجود داشته باشه