PDA

View Full Version : سوال: اضافه کردن خاصیت Required به کنترل textbox



armsoftpc
پنج شنبه 26 مرداد 1391, 15:58 عصر
به نام خدا
با سلام
همانطور که از عنوان تاپیک پیداست ، برای این کار باید یک کلاس مثلا (ATextbox) از کلاس Textbox مشتق کرده و خاصیتی با این عنوان به آن اضافه کنیم، که اگر آتکست باکس ما خاصیت Required=true تا پر نشده است، دکمه ارسال کننده فرم(یا هر چیز دیگر) غیر فعال باشد، همانند html5. که برای این کار خاصیت برای دریافت نام کنترل باتن از نوع باتن از کاربر دریافت میکنیم، اما مشکل اینجاست که این شی(شی باتن) در هنگام ساخت تکست باکس(سازنده ی کلاس) برابر نول است که اجازه نمی دهد ما از خاصیت ها کنترل باتن(منظور Enabled) استفاده کنیم ، اکنون راه حل به نظر شما بزرگوران چیست؟:متفکر:
اینم کدش:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows.Forms;

namespace ATextBox
{
public class ATextBox : TextBox
{
public Button btnSend_name;
public Button BtnSend_name
{
get
{
return btnSend_name;
}
set
{
btnSend_name = value;
}
}


public bool required;
public bool Required
{
get
{
return required;
}
set
{
required = value;
}
}


public ATextBox()
{
txtATB_TextChanged(null, null);
base.TextChanged += new EventHandler(this.txtATB_TextChanged);
base.Leave += new EventHandler(this.txtATB_TextChanged);

if (btnSend_name != null)
btnSend_name.Leave += new EventHandler(this.txtATB_TextChanged);
}

public void txtATB_TextChanged(object sender, EventArgs e)
{
if (required == true)
{
if (Text == "" || Text==" ")
{
this.BackColor = System.Drawing.Color.Yellow;
btnSend_name.Enabled = false;
}
else
{
this.BackColor = System.Drawing.Color.White;
btnSend_name.Enabled = true;
}
}
}


}
}

ali_habibi1384
پنج شنبه 26 مرداد 1391, 17:03 عصر
بالاخره باتنت روي يك فرم قرار ميگيره. كافيه هندل فرم رو بدست بياري و باتني كه خاصيت Dialigresult مثلا ok هست رو false كني

Farshid007
پنج شنبه 26 مرداد 1391, 18:50 عصر
خوب از کجا می فهمی که کدوم دکمه Submit هست؟
تو HTML5 تگ دکمه ساب ما برای ارسال مقادیر به صفحه دیگر برای پردازش اطلاعات (یا همان صفحه:سابمیشن تک صفحه ای ) اما تو سی شارپ که اینجوری نیست!:متعجب:

به نظر من:
بهترین راه برای این کار استفاده از Try Catch می باشد

armsoftpc
جمعه 27 مرداد 1391, 12:24 عصر
به نام خدا
با سلام

بالاخره باتنت روي يك فرم قرار ميگيره. كافيه هندل فرم رو بدست بياري و باتني كه خاصيت Dialigresult مثلا ok هست رو false كني
ممنون از توضیحاتتون، اما مثال می زدید ، بهتر بود.:چشمک:

به نظر من برای راحتی بیشتر
برای باتن از همون اول enable را false کن بعد
دوست عزیز این کدی که من گذاشتم ، قراره که در یک فایل dll قرار بگیره و برنامه نویسان دیگر ازش استفاده کنند، من چطور می تونم تو فرم اون برنامه نویس برم و باتن ارسال کننده disable کنم، البته ایده شما ایده بسیاری خوبی است :تشویق:اما در این جا جواب نمی دهد، چون مفهوم کپسولی سازی کلا حذف می شود.

خوب از کجا می فهمی که کدوم دکمه Submit هست؟
لازم نیست من بفهمم برنامه نویس وقتی که خاصیت BtnSend_name رو تنظیم می کنه ، دکمه ارسال کننده مشخص میشه.

تو HTML5 تگ دکمه ساب ما برای ارسال مقادیر به صفحه دیگر برای پردازش اطلاعات (یا همان صفحه:سابمیشن تک صفحه ای ) اما تو سی شارپ که اینجوری نیست!:متعجب:
اتفاقا توی سی شارپ خیلی راحت تر میشه پیاده سازیش کرد ، اگر فقط همون اروری که گفتم وجود نداشت:متفکر:، تازه به نظر شما یک فرم می تواند بیش از یک دکمه ارسال کننده داشته باشد.:لبخند:

Farshid007
جمعه 27 مرداد 1391, 12:50 عصر
بالاخره باتنت روي يك فرم قرار ميگيره. كافيه هندل فرم رو بدست بياري و باتني كه خاصيت Dialigresult مثلا ok هست رو false كني
داش علی منظورت رو متوجه نشدم!میشه بیشتر توضیح بدی

armsoftpc
جمعه 27 مرداد 1391, 13:09 عصر
داش علی منظورت رو متوجه نشدم!میشه بیشتر توضیح بدی
همچنین، لطفا (با همه ی دوستانم) کد ها را امتحان و کامپایل کنید ، بعد نظرتون به اشتراک بزارید.

armsoftpc
جمعه 27 مرداد 1391, 15:52 عصر
دوستان، پس چی شد؟...

Farshid007
جمعه 27 مرداد 1391, 16:05 عصر
من که کد هاتو تست کردم جواب
یه تکست باکس بعد یه باتن اضافه کردم
بعد تنظیماتشو انجام دادم(ست کردن دکمه و ...)
بعد تو کد دکمه نوشتم مسیج بده که انجام شد
بعد وقتی ران کردم تکست باکسو که خالی کردم مسیج نمی داد و باتن غیر فعال می شد و تکست باکس زرد می شد
اما وقتی پرش کردم جواب داد

armsoftpc
جمعه 27 مرداد 1391, 16:35 عصر
به نام خدا
با سلام

من که کد هاتو تست کردم جواب
اشتباه می کنی.

بعد وقتی ران کردم تکست باکسو که خالی کردم
این کار که قبلا هم مشکلی نداشت چون به رویداد text_change ربط دارد، مشکل غیر فعال سازی دکمه در شروع برنامه است.
if (btnSend_name != null)
btnSend_name.Leave += new EventHandler(this.txtATB_TextChanged);

اگر ایف رو بر داری ، درجا ارور میده!:گریه:

Farshid007
جمعه 27 مرداد 1391, 17:24 عصر
تنها راهش اینه که یه ایونت درست کنی به نام btn_send_Changed

خوب یادم نیست بزا به کتاب محمد هاشمیان یه سر بزنم اگه تونستم درستش کنم حتما بهت می گم

Farshid007
جمعه 27 مرداد 1391, 17:33 عصر
یه کاری هم میشه قسمت Publish btnsend_name رو این جوری تغییر بدی:
get
{
return btnSend_name;
}
set
{
btnSend_name = value;
(value as Button).Enabled = false;
}

armsoftpc
شنبه 28 مرداد 1391, 17:07 عصر
با سلام

من به اینصورت نوشتم جواب داددکمه شما نیز یک مشکلی دارد، به این صورت که وقتی اولین تکست باکس رو پر می کنی، دکمه فعال میشه! که این خودش یه مشکل چون ما می خواهیم که تمامی فیلد ها پر شود بعد دکمه فعال شود و اگر کاربر احیانا فیلدی را خالی کرد ، دکمه غیر فعال شود.
دکمه شما اولین خاصیت یعنی با اجرای برنامه غیرفعال شود را پیاده سازی کرده است، اما متاسفانه هنوز باگ دارد.:متفکر:
عکسش رو ضمیمه کرده ام.:چشمک:
91465

armsoftpc
شنبه 28 مرداد 1391, 17:14 عصر
سلام

یه کاری هم میشه قسمت Publish btnsend_name رو این جوری تغییر بدی:
همین مشکل پست بالا رو که توضیح دادم رو داره.:تشویق:

armsoftpc
شنبه 28 مرداد 1391, 19:56 عصر
با سلام

فکر نمی کنید یک رویداد برای این کار در فرمتون بنویسید بهتر باشه.
دوست عزیز چرا صورت مسئله رو پاک می کنی!!!:چشمک:
قصد ما کپسوله سازی و جداسازی کدهاست ، که فقط برنامه نویس با پر کردن دو تا فیلد این کار ها به صورت اتومات انجام بشه!

با یک تکه کد امکانپذیره
به ازای هر تکست باکس ، فکر 100 فرم داریم که هر کدوم به طور متوسط 15 تکست باکس دارند ، حالا این تکه کدها تکرارشون به 1500 بار می رسد، که عدد وحشتناکی است، چون همه ی کد ها تکراری هستند.

armsoftpc
یک شنبه 29 مرداد 1391, 11:54 صبح
از دوستان کسی به تنیجه ی خاصی نرسیده است...

armsoftpc
یک شنبه 29 مرداد 1391, 15:11 عصر
مثل این که خودم باید دست به کار بشم...

Mahmoud.Afrad
یک شنبه 29 مرداد 1391, 16:54 عصر
مثل این که خودم باید دست به کار بشم...
بسم ا... :چشمک:






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

با findform ، فرم رو بگیرید و باقی ماجرا
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

class CustomTextBox : TextBox
{
private Button _btnSend;
private Color _warningColor;
private Color _defaultBackColor;
private int _count = 0;

public Button SendButton
{
get { return _btnSend; }
set { _btnSend = value; }
}

public Color WarningBackColor
{
get { return _warningColor; }
set { _warningColor = value; }
}

protected override void OnCreateControl()
{
base.OnCreateControl();

// get default back color on create textBox
_defaultBackColor = base.BackColor;

if (_btnSend != null)
{
base.BackColor = _warningColor;
_btnSend.Enabled = false;
}
}

protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);

if (base.FindForm() != null)
{
_count = base.FindForm().Controls.OfType<CustomTextBox>().Count(txt => txt._btnSend != null && txt.Text == string.Empty);
}

if (base.Text.Trim() == string.Empty)
{
// if text is empty or spaces
// set back color to _warningColor
base.BackColor = _warningColor;
}
else
{
// set back color after fill textBox to _defaultBackColor
base.BackColor = _defaultBackColor;
}

if (_btnSend != null)
{
if (_count == 0) // if count of empty customtextboxes equals 0
_btnSend.Enabled = true; // enable button
else
_btnSend.Enabled = false;
}
}
}

armsoftpc
دوشنبه 30 مرداد 1391, 17:11 عصر
با سلام
دوست عزیز با تشکر فراوان از شما بدرستی کار کرد.:قلب:
اگر دوست داشتید ، توضیح بدید نحوه کارش چه جوریه، اگر دوست نداشتی به هر حال دستت درد نکنه.:بوس:

Mahmoud.Afrad
دوشنبه 30 مرداد 1391, 18:35 عصر
توی رویداد textchanged اومدم فرم رو بدست آوردم(البته اگر مخالف null) بعد تعداد CustomTextBox هایی که SendButton شان مخالف null هست(یعنی باتن ست شده) و خصیصه text شان خالی هست را بدست میاریم(با لینک) بعد اگر این تعداد بزرگتر از صفر بود باید باتن غیر فعال بشه ولی اگر تعداد صفر شد یعنی CustomTextBox ای که خالی باشه روی فرم نیست و باتن فعال میشه.

bibobibo
شنبه 08 مهر 1391, 11:19 صبح
کسی می دونه چرا وقتی چیزی رو تو textbox می نویسیم چرا تو جدول قبلش این عبارتwindows system.form textbox,text میاد؟