PDA

View Full Version : تعریف یک تابع برای چند تکست باکس



gachboy
یک شنبه 01 اسفند 1400, 19:07 عصر
سلام وقت بخیر
حدود 10 تکست باکس دارم و میخوام که همشون فقط عددی کنم با کد زیر :
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) {
{
// متن
string text = ((Control)sender).Text;
// عدد اعشاری
if (e.KeyChar == '.' && text.Length > 0 && !text.Contains("."))
{
e.Handled = false;
return;
}
// عدد
e.Handled = (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar));
}
}


الان این کد فقط برای textbox1 است و باید برای 9تا تکست باکس دیگه همین کد تکرار کنم...راه بهتری وجود داره که نیاز به این همه کد نباشه؟

محمد رضا فاتحی
دوشنبه 02 اسفند 1400, 07:27 صبح
سلام دوست عزیز
شما می تونید دو تا کار بکنید
یا این تابع رو به همه Event های مورد نظرتون انتساب بدین
یا یه UserControl بسارید و این کد رو داخل اون یوزرکنترل وارد کنید و از ارش به عنوان یه TextBox جدید استفاده کنید

gachboy
دوشنبه 02 اسفند 1400, 09:11 صبح
سلام دوست عزیز
شما می تونید دو تا کار بکنید
یا این تابع رو به همه Event های مورد نظرتون انتساب بدین
یا یه UserControl بسارید و این کد رو داخل اون یوزرکنترل وارد کنید و از ارش به عنوان یه TextBox جدید استفاده کنید


چون تازه برنامه نویسی شروع کردم مبتدی هستم، چجور باید این تابع رو به همه Event های مورد نظر انتساب بدم؟:لبخندساده:

gachboy
جمعه 06 اسفند 1400, 12:03 عصر
سلام دوست عزیز
شما می تونید دو تا کار بکنید
یا این تابع رو به همه Event های مورد نظرتون انتساب بدین
یا یه UserControl بسارید و این کد رو داخل اون یوزرکنترل وارد کنید و از ارش به عنوان یه TextBox جدید استفاده کنید


سلام :قلب:
UserControl ساختم و مشکلم برای اعداد حل شد...ولی الان یک مشکل جدید دارم که یوزر کنترلی که ساختم مثل تکست باکس معمولی رویداد textBox_TextChanged نداره...باید چکار کنم؟

ROSTAM2
جمعه 06 اسفند 1400, 14:02 عصر
سلام.
وراثت رو از UserControl به TextBox تغییر بده، درست می شه.

gachboy
شنبه 07 اسفند 1400, 08:22 صبح
چجور باید اینکار کنم؟

ROSTAM2
شنبه 07 اسفند 1400, 19:12 عصر
واقعا ک :لبخند: زبان تاپیک رو اشتباه گرفته بودم

اینم برای تعیین وراثت یک کلاس (#C)


class NumericTextBox:System.Windows.Forms.TextBox
{


}


برای اینکه از رویداد پیشفرض استفاده کنیم:


class NumericTextBox:System.Windows.Forms.TextBox
{
protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{

// عدد اعشاری
if (e.KeyChar == '.' && Text.Length > 0 && !Text.Contains("."))
{
e.Handled = false;
return;
}
// عدد
e.Handled = (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar));
base.OnKeyPress(e);
}
}

gachboy
دوشنبه 09 اسفند 1400, 23:56 عصر
مررررررسی:قلب::قلب:

ROSTAM2
سه شنبه 10 اسفند 1400, 14:51 عصر
سلام مجدد. برای ایجاد شیء وراثتی:
https://www.aparat.com/v/xAGsM

gachboy
چهارشنبه 11 اسفند 1400, 14:47 عصر
خدایی خدایی دمت گرم...میدونی چرا؟
اگر این ویدیو ساخت خودت باشه خیلی خیلی ساده و عالی توضیح دادی بدون هیچ حاشیه اضافه ای:تشویق:
یک سوال دیگه برای تغییر backcolor در رویداد Enter و Leave تکست باکس در کلاس باید چجور تعریف کرد؟ داخل یوزر کنترل میتونم ولی داخل کلاس مشکل دارم:اشتباه:
فقط یک فیلم اموزشی هم در مورد نرم افزار هایی که باهاش فیلم اموزشی ساختی هم معرفی کن و بگو چجور از پرده سبز استفاده کردی یا چکار کردی که صدات واضح بود:لبخند:
ما بچه جنوبا با هرکسی حال کنیم میگیم دمت گرم،خدایی دمت خیلی گرم:قلب::لبخند:

ROSTAM2
چهارشنبه 11 اسفند 1400, 18:12 عصر
یک سوال دیگه برای تغییر backcolor در رویداد Enter و Leave تکست باکس در کلاس باید چجور تعریف کرد؟ داخل یوزر کنترل میتونم ولی داخل کلاس مشکل دارم


مثل همون رویداد KeyPress


protected override void OnEnter(EventArgs e)
{
// Statements
base.OnEnter(e);
}


protected override void OnLeave(EventArgs e)
{
// Statements
base.OnLeave(e);
}


به جای Statements دستوراتت رو بنویس. برای فراخوانی خصوصیات این کلاس هم از کلمه کلیدی this استفاده میشه.


نرم افزاری که از دسکتاپ تصویر گرفته LiveScreen Capture از Corel VideoStudio هستش.
برای کم کردن حجم فایل خروجی از این نرم افزار هم از Avidemux استفاده می کنم: https://www.aparat.com/v/CwBl6
برای حذف پرده سبز هم از ویرایشگر خود Corel VideoStudio استفاه کردم. https://www.aparat.com/v/7jbxR
اگه وقت کردم ویدئوشو می سازم.
برای صدا هم میکروفون یقیه ای کارول مدل MDM-862 (البته با استفاده از کارت صدا اکسترنال(USB))

gachboy
پنج شنبه 12 اسفند 1400, 00:56 صبح
مثل همون رویداد KeyPress


protected override void OnEnter(EventArgs e)
{
// Statements
base.OnEnter(e);
}


protected override void OnLeave(EventArgs e)
{
// Statements
base.OnLeave(e);
}


به جای Statements دستوراتت رو بنویس. برای فراخوانی خصوصیات این کلاس هم از کلمه کلیدی this استفاده میشه.


نرم افزاری که از دسکتاپ تصویر گرفته LiveScreen Capture از Corel VideoStudio هستش.
برای کم کردن حجم فایل خروجی از این نرم افزار هم از Avidemux استفاده می کنم: https://www.aparat.com/v/CwBl6
برای حذف پرده سبز هم از ویرایشگر خود Corel VideoStudio استفاه کردم. https://www.aparat.com/v/7jbxR
اگه وقت کردم ویدئوشو می سازم.
برای صدا هم میکروفون یقیه ای کارول مدل MDM-862 (البته با استفاده از کارت صدا اکسترنال(USB))


مرسی رستم جان،اون دو تا فیلم هم دیدم عالی بودن دمت گرم:تشویق:
هنوز برای تغییر backcolor در رویداد Enter و Leave تکست باکس در کلاس مشکل دارم،با this هم هر کاری کردم ارور میداد،لطفا با کد برای من مبتدی توضیح بده که چجور بک گراند تکست باکس عوض کنم در کلاس...چون در یوزر کنترل راحت میشد ولی داخل کلاس هر کاری کردم نشد:لبخند:

ROSTAM2
پنج شنبه 12 اسفند 1400, 18:56 عصر
هنوز برای تغییر backcolor در رویداد Enter و Leave تکست باکس در کلاس مشکل دارم،با this هم هر کاری کردم ارور میداد،لطفا با کد برای من مبتدی توضیح بده که چجور بک گراند تکست باکس عوض کنم در کلاس...چون در یوزر کنترل راحت میشد ولی داخل کلاس هر کاری کردم نشد​


کدی که نوشتی و اون خطایی رو که داره ارسال کن ببینیم

این ریفرنس رو به کلاس اضافه کن:


using System.Drawing;



this.BackColor = Color.Black;

gachboy
جمعه 13 اسفند 1400, 09:25 صبح
میدونی مشکل کارم کجا بود؟ از این رفرنس استفاده نمیکردم واسه همین با this هر کاری میکردم نمیشد،ولی الان اوکی شده
کارت خیلی درسته رستم جان،ممنون:قلب::تشویق:

gachboy
دوشنبه 01 فروردین 1401, 14:44 عصر
سلامی دوباره:لبخند:

protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e) {


// عدد اعشاری
if (e.KeyChar == '.' && Text.Length > 0 && !Text.Contains("."))
{
e.Handled = false;
return;
}
// عدد
e.Handled = (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar));
base.OnKeyPress(e);
}

در کد بالا اگر بخوایم در تکست باکس عدد اعشاری وارد کنیم حتما باید فرضا به این صورت اعشار بنویسیم : 0.5 یعنی حتما باید اعشار را با 0 شروع کنیم وگرنه بخوایم .5 تایپ کنیم نمیشه...
برای این مشکل Text.Length > 0 حذف کردم مشکل درست شد ولی موقعی از قبل عددی در تکست باکس تایپ کرده باشیم و با موس عدد داخل تکست باکس انتخاب کنیم و بخوایم یک عدد اعشاری وارد کنیم حتما باید عدد داخل تکست باکس اول پاک کنیم بعد عدد اعشاری وارد کنیم...برای حل این مشکل باید چکار کنم؟ امیدوارم منظورم رسونده باشم:لبخند:

ROSTAM2
دوشنبه 01 فروردین 1401, 15:12 عصر
سلام.

فک کنم کد صحیح این باشه تست کن ببین درست باشه:


TextBox Box = (TextBox)sender;
if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b' || (e.KeyChar == '.' && !Box.Text.Contains(".")))
{
e.Handled = false;
}
else
{
e.Handled = true;
}

//

if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b' || (e.KeyChar == '.' && !Text.Contains(".")))
{
e.Handled = false;
}
else
{
e.Handled = true;
}

gachboy
دوشنبه 01 فروردین 1401, 16:01 عصر
سلام.

فک کنم کد صحیح این باشه تست کن ببین درست باشه:


TextBox Box = (TextBox)sender;
if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b' || (e.KeyChar == '.' && !Box.Text.Contains(".")))
{
e.Handled = false;
}
else
{
e.Handled = true;
}

//

if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b' || (e.KeyChar == '.' && !Text.Contains(".")))
{
e.Handled = false;
}
else
{
e.Handled = true;
}




سلام رستم جان
نه هنوز مشکل داره،اگر داخل تکست باکس عددی باشه و بعد با موس عدد داخل تکست باکس سلکت کنیم و بخوایم عدد اعشار دیگه ای بنویسیم کاراکتر پوینت . کار نمیکنه و عدد قبلی داخل تکست پاک نمیشه ولی از 0 تا 9 هر عدد دیگه ای بزنیم عدد قبلی داخل تکست باکس پاک میشه

ROSTAM2
دوشنبه 01 فروردین 1401, 16:28 عصر
من برای یک اعشار نوشتمش مثل ماشین حساب

به این کدها نگاه کن مخصوصا اونی که تیک سبز خورده:
https://stackoverflow.com/questions/508533/numeric-textbox

gachboy
دوشنبه 01 فروردین 1401, 19:13 عصر
کدها همه درست هستن ولی یک باگ دارن،مشکلشون اینه که اگر داخل تکست باکس نقطه یا همون پوینت باشه وقتی که با موس اعداد داخل تکست باکس سلکت میکنیم دیگه نمیتونیم پوینت روی کیبورد بزنیم که اعداد قبلی داخل تکست باکس پاک بشه،بخاطر کد زیر داخل خط اول :
&& !Text.Contains(".")
که میگه اگر داخل تکست باکس پوینت وجود داشت e.Handled = false باشه ، بخاطر همین اگر عددی اعشاری داخل تکست باکس باشه وقتی با موس اعداد داخل تکست باکس سلکت میکنیم دیگه نمیتونیم پوینت روی کیبورد بزنیم که اعداد قبلی داخل تکست باکس پاک بشه چون داخل تکست باکسمون پوینت داریم...
برای حل این مشکل باید چکار کنیم؟

ROSTAM2
دوشنبه 01 فروردین 1401, 20:10 عصر
به جای اون از متغیر CheckForDecimal استفاده کن چک می کنه اگه اعشار تو متن انتخاب شده باشه محددا می شه از اعشار استفاده کرد:


TextBox Box = (TextBox)sender;
Boolean CheckFordecimal = !Box.SelectedText.Contains(".");
if (CheckFordecimal)
{
CheckFordecimal = Box.Text.Contains(".");
}

if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b' || (e.KeyChar == '.' && !CheckFordecimal ))
{
e.Handled = false;
}
else
{
e.Handled = true;
}

gachboy
سه شنبه 02 فروردین 1401, 12:15 عصر
رستم جان از کد در کلاس دارم استفاده میکنم، خط اول کد واسم خطا میزنه که textbox و sender ناشناخته ی...

class Ntextbox : System.Windows.Forms.TextBox {


protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{




TextBox Box = (TextBox)sender;
Boolean CheckFordecimal = !Box.SelectedText.Contains(".");
if (CheckFordecimal)
{
CheckFordecimal = Box.Text.Contains(".");
}


if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b' || (e.KeyChar == '.' && !CheckFordecimal))
{
e.Handled = false;
}
else
{
e.Handled = true;
}




}
}


مشکل چیه

ROSTAM2
سه شنبه 02 فروردین 1401, 13:34 عصر
خخخ تقصیر من شد تو این کلاس دیگه خود کلاس TextBox هستش.


protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{
Boolean CheckFordecimal = !SelectedText.Contains(".");
if (CheckFordecimal)
{
CheckFordecimal = Text.Contains(".");
}

if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b' || (e.KeyChar == '.' && !CheckFordecimal))
{
e.Handled = false;
}
else
{
e.Handled = true;
}




}

gachboy
سه شنبه 02 فروردین 1401, 13:59 عصر
الان کل مشکلاتش حل شد،بهترین کد برای تکست باکس:تشویق::لبخند: