PDA

View Full Version : چند فرمي و غيرفعال كردن همه textBox ها



Davood_amega
یک شنبه 06 تیر 1389, 11:25 صبح
بنده چند تا فرم دارم كه نياز دارم در هركدام كل TextBoxها را فعال و غيرفعال كنم. بنابراين از يك كلاس استفاده كردم به شكل زير :


public class Cls_DataBase
{
public void objectInactive(Form sa)
{
foreach (Control My in sa.Controls)
{
if (My is TextBox)
(My as TextBox).Enabled = false;
}
}
public void objectActive(Form sa)
{
foreach (Control My in sa.Controls)
{
if (My is TextBox)
(My as TextBox).Enabled = true;
}
}

و براي فراخواني آن مثلا تو فرم frmDelEdi از كد زير استفاده كردم .


Cls_DataBase instance = new Cls_DataBase();
instance.objectInactive((System.Windows.Forms.Form )frmDelEdi);

اما نميتونه اين تبديل را انجام بده وخطاي زير را مي دهد !

'frmDelEdi' is a 'type' but is used like a 'variable'

mahdi87_gh
یک شنبه 06 تیر 1389, 11:57 صبح
به جای

(System.Windows.Forms.Form)frmDelEdi


بنویس


Application.OpenForms["frmDelEdi"] as frmDelEdi

Davood_amega
یک شنبه 06 تیر 1389, 12:24 عصر
ممنون اما من تو Wpf دارم برنامه ام را مي نويسم كه متد Openforms وجود ندارد .

Davood_amega
یک شنبه 06 تیر 1389, 15:52 عصر
دوستان همچنان منتظر كمك شما هستم !

Davood_amega
دوشنبه 07 تیر 1389, 09:24 صبح
دوستان كسي نيست كمكم كنه !

sds1920
دوشنبه 07 تیر 1389, 09:39 صبح
شما Constractor کلاس رو تعریف نکردید و به صورت پیش فرض Private در نظر گرفته می شه.
برای این کار کد زیر رو به کلاس اضافه کنید :


Public Cls_DataBase()
{}


ولی من توصیه می کنم که توابع کلاس رو به صورت static تعریف کنید.
در اینصورت توی کد نویسی زیباتر می شه و نیازی نیست که از روی کلاس شی ساخته بشه.
از طرفی نیازی به Constractor هم نخواهید داشت.

homan1374
دوشنبه 07 تیر 1389, 09:44 صبح
خوب تو WPF که Form نداریم
به جای Form باید Window به تابع بفرستی و همچنین تابعت هم باید window بگیره

homan1374
دوشنبه 07 تیر 1389, 09:54 صبح
کدتون خوندم اصلا با WPF جور در نمیاد که!!
اگه از این ک استفاده کنید بهتره:

public void EnatxtBox(Grid G)
{
foreach (Control C in G.Children)
{
if (C is TextBox)
{
C.IsEnabled = false;
}
}
}

exlord
دوشنبه 07 تیر 1389, 10:03 صبح
instance.objectInactive((System.Windows.Forms.Form )frmDelEdi);[/code
اولا اگه توی خود فرم frmDelEdi هستی بنویس ...

instance.objectInactive(this);
دموا این کد تو wpf جواب نمیده ....

Davood_amega
دوشنبه 07 تیر 1389, 10:43 صبح
شما Constractor کلاس رو تعریف نکردید و به صورت پیش فرض Private در نظر گرفته می شه.
برای این کار کد زیر رو به کلاس اضافه کنید :


Public Cls_DataBase()
{}


ولی من توصیه می کنم که توابع کلاس رو به صورت static تعریف کنید.
در اینصورت توی کد نویسی زیباتر می شه و نیازی نیست که از روی کلاس شی ساخته بشه.
از طرفی نیازی به Constractor هم نخواهید داشت.
sds1920 عزيز به نظرم كاري كه مي خواهم بكنم به Constractor کلاس مربوط نيست !

Davood_amega
دوشنبه 07 تیر 1389, 10:44 صبح
خوب تو WPF که Form نداریم
به جای Form باید Window به تابع بفرستی و همچنین تابعت هم باید window بگیره

homan1374 عزيز با نظر شما كاملا موافقم و كلاسم بايد به اين صورت تغيير كند .


public void EnatxtBox(Window s)
{
foreach (Control C in s>)
{
if (C is TextBox)
{
C.Enabled = false;
}
}
}

اما ديگه متدي به نام Control يا متدهاي ديگري وجود ندارد كه بعد از s (s.Controls)قرار دهم .
در مورد grid هم كه نوشته بوديد اول بايد Window را به كلاس ارسال كنيم تا تشخيص بده تغييرات رو در كدام Window اعمال كند ، ضمنا كنترل grid نميتونه كنترلهاي داخلش را تشخيص دهد .

Davood_amega
دوشنبه 07 تیر 1389, 10:47 صبح
اولا اگه توی خود فرم frmDelEdi هستی بنویس ...

instance.objectInactive(this);
دموا این کد تو wpf جواب نمیده ....
exlord عزيز مشكل حل نشد .

homan1374
دوشنبه 07 تیر 1389, 11:52 صبح
این یکی فکر کنم کارتو راه بندازه

public void EnatxtBox(Window win)
{
Grid G = (Grid)win.Content;

foreach (Control C in G.Children)
{
if (C is TextBox)
{
C.IsEnabled = false;
}
}
}

Davood_amega
دوشنبه 07 تیر 1389, 12:32 عصر
homan1374 ممنون تقريبا درست شد و كدموبه اين صورت تغيير دادم تا درست بشه !
اما يه مشكل كوچيك داشت . من داخل Grid ام يك Rectangle و يه Image دارم كه بايد اين دوتا را پاك كنم تا جواب بده . خطاهي زير را مي دهد .

Unable to cast object of type 'System.Windows.Shapes.Rectangle' to type 'System.Windows.Controls.Control'.

Unable to cast object of type 'System.Windows.Controls.Image' to type 'System.Windows.Controls.Control'.
ضمنا مي خواستم به جاي IsEnabled از IsReadOnly استفاده كنم اما اين متد اينجا پشتيباني نمي شد .

homan1374
دوشنبه 07 تیر 1389, 12:40 عصر
این دیگه حله!

public void EnatxtBox(Window win)
{
Grid G = (Grid)win.Content;

foreach (object C in G.Children)
{
if (C is Control)
{
if (C is TextBox)
{
((TextBox)C).IsEnabled = false;
}
}

}
}

exlord
دوشنبه 07 تیر 1389, 12:43 عصر
به جای Control بنویس UIElement

Davood_amega
دوشنبه 07 تیر 1389, 13:06 عصر
بالاخره با كمك دوستان عزيز homan1374 و exlord مشكل حل شد .
كد نهايي :

public void EnatxtBox(Window s)
{
Grid G = (Grid)s.Content;
foreach (UIElement C in G.Children)
{
if (C is TextBox)
{
C.IsEnabled = false;
}
}
}
اما همچنان با IsReadOnly مشكل دارم .
چرا IsReadOnly به جاي IsEnabled نمياد ؟

homan1374
دوشنبه 07 تیر 1389, 13:10 عصر
ییعنی میخوای textbox ها رو ReadyOnly کنی؟

Davood_amega
دوشنبه 07 تیر 1389, 13:12 عصر
ییعنی میخوای textbox ها رو ReadyOnly کنی؟
آره
يه تابعدارم كه ReadOnly مي كنه و يه تابع از ReadOnly در مياره !

homan1374
دوشنبه 07 تیر 1389, 13:13 عصر
فکر میکنم شما به جای این که IsReadyOnly رو true کنی داری False میکنی درسته؟؟؟
میخواهید چیکار کنید؟؟؟

Davood_amega
دوشنبه 07 تیر 1389, 13:16 عصر
نه نگاه كنيد من به جاي :

C.IsEnabled = false;
كد زير را ميخام :

C.IsReadOnly= false;
اما اين متد اصلا وجود ندارد . درحالت عادي IsReadOnly مي آيد اما وقتي به اين صورت كد را مي نويسيم (كه بروي كل TextBox ها اعمال شود ) اين متد وجود ندارد .

homan1374
دوشنبه 07 تیر 1389, 13:36 عصر
باید نخست Uielement به textbox تبدیل شه بعد داره

((TextBox)C).IsReadOnly = false ;

Davood_amega
دوشنبه 07 تیر 1389, 15:16 عصر
كد نهايي براي ReadOnly كردن TextBox هاي يك Window در WPF :


public void EnatxtBox(Window s)
{
Grid G = (Grid)s.Content;
foreach (UIElement C in G.Children)
{
if (C is TextBox)
{
((TextBox)C).IsReadOnly = true ;
}
}
}


با تشكر از homan1374 و exlord