PDA

View Full Version : تکست باکس از نوع float



cnmeysam
دوشنبه 09 آذر 1394, 11:48 صبح
سلام
یه سوال داشتم من چند تا تکست باکس دارم که تعدادشون هم زیاده یک دیتابیس هم دارم که sql server هستش و از نوع float هم تعریف شدن حالا وقتی ثبت رو میزنم ثبت میشه ولی وقتی میخوام ویرایش کنم موقع لود تو صفحه هم تو دیتا گرید هم بعد سلکت کردن تو تکست باکس ها بجای مثلا 1.5 مینویسه 1/5 و ارور میده یعنی بعبارتی مجبورم مثلا 50 تا تکست رو دوباره از اول بنویسم مثلا 1.5 تا اجازه ثبت بده کسی راه حلی داره که از این مشکل خلاص شم؟

abdullah20
دوشنبه 09 آذر 1394, 12:08 عصر
این مربوط به تنظیمات ویندوز میشه

137152

ghasemloo
دوشنبه 09 آذر 1394, 12:16 عصر
سلام این یکی از راه حلهاشه


private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '/')
{
e.KeyChar='.';
}
}

cnmeysam
دوشنبه 09 آذر 1394, 12:16 عصر
این مربوط به تنظیمات ویندوز میشه

137152
ممنون ولی من نمیخوام مجبور بشم به کاربرام بگم تنظیماتشون رو عوض کنن راه حل دیگه ای نداره؟

abdullah20
دوشنبه 09 آذر 1394, 12:23 عصر
خب میتونید Replace کنید

محمد رضا فاتحی
دوشنبه 09 آذر 1394, 12:30 عصر
سلام این یکی از راه حلهاشه


private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '/')
{
e.KeyChar='.';
}
}



دوست عزیز طبق سوال وقتی اعداد از دیتابیس وارد تکست باکس می شن این اتفاق میوفته این کد شما وقتی کاربرد داره که می خوای عدد رو تایپ کنی...
باید کد Replace رو در رویداد TextChanged نوشت

cnmeysam
دوشنبه 09 آذر 1394, 12:39 عصر
دوست عزیز طبق سوال وقتی اعداد از دیتابیس وارد تکست باکس می شن این اتفاق میوفته این کد شما وقتی کاربرد داره که می خوای عدد رو تایپ کنی...
باید کد Replace رو در رویداد TextChanged نوشت
راهی نیست که مجبور نشم بالای 80 تا تکست باکس رو واسشون یکی یکی این کد ریپلیس رو بنویسم؟

محمد رضا فاتحی
دوشنبه 09 آذر 1394, 12:52 عصر
می تونی از کنترل شفارشی استفاده کنی...

فقط یه نکته...اگه تو این تکسباکس ها از رویداد TextChange استفاده نکردی اینکار رو بکن
یه کلاس ایجاد بکن

class MyTextBox:TextBox
{
protected override void OnTextChanged(EventArgs e)
{
base.Text = base.Text.Replace("/", ".");
base.SelectionStart = base.TextLength;
}
}


و بعد از بیلد کردن پروژه یه کنترل اضافه می شه می تونی از اون به جای تکسباکس ها استفاده کنی...
راه حل بهتری الان به ذهنم نمی رسه

cnmeysam
دوشنبه 09 آذر 1394, 13:03 عصر
می تونی از کنترل شفارشی استفاده کنی...

فقط یه نکته...اگه تو این تکسباکس ها از رویداد TextChange استفاده نکردی اینکار رو بکن
یه کلاس ایجاد بکن

class MyTextBox:TextBox
{
protected override void OnTextChanged(EventArgs e)
{
base.Text = base.Text.Replace("/", ".");
base.SelectionStart = base.TextLength;
}
}


و بعد از بیلد کردن پروژه یه کنترل اضافه می شه می تونی از اون به جای تکسباکس ها استفاده کنی...
راه حل بهتری الان به ذهنم نمی رسه

شرمنده ولی یک سوال دستوری نداریم که وقتی فرم لود میشه windows decimal symbol رو تغییر بده به . و وقتی فرم بسته میشه برش گردونه به / یعنی دستور رو بذارم تو فرم لود windows decimal symbol بشه . و وقتی دستور رو بذارم تو فرم کلوز windows decimal symbol بشه / ؟؟؟؟....

cnmeysam
دوشنبه 09 آذر 1394, 14:01 عصر
سلام این یکی از راه حلهاشه


private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '/')
{
e.KeyChar='.';
}
}



این روش جوابگو نیست چون وقتی از دیتا گرید لود میکنه باز هم / لود میشه تو تکست باکس و چون دیتا بیس از نوع float هستش ارور میده و اجازه ویرایش نمیده مگه اینکه دوباره اون اعداد رو بنویسیم

Mahmoud.Afrad
دوشنبه 09 آذر 1394, 19:54 عصر
در فارسی ممیز رو با / نمایش میدن. در نمایش فکر نمیکنم مشکلی باشه که / نمایش داده بشه. اما برای ثبت در دیتابیس و یا ویرایش باید کد را طوری بنویسید که مستقل از Culture و فرمت انتخابی در ویندوز ثبت انجام بشه.
کد ثبت و ویرایش رو بزارید.

cnmeysam
دوشنبه 09 آذر 1394, 21:41 عصر
در فارسی ممیز رو با / نمایش میدن. در نمایش فکر نمیکنم مشکلی باشه که / نمایش داده بشه. اما برای ثبت در دیتابیس و یا ویرایش باید کد را طوری بنویسید که مستقل از Culture و فرمت انتخابی در ویندوز ثبت انجام بشه.
کد ثبت و ویرایش رو بزارید.
کد برای ثبت :
con.ExecuteNonQuery("Insert into dbo.Formula values(N'" + TxtSerial.Text + "',N'" + dateTimePickerStart.Text + "'," + "N'" + dateTimePickerEnd.Text + "',N'" + TxtFormul.Text + "',N'" + ComboMahsul.Text + "'" +
",N'" + ComboKala.Text + "',N'" + ComboNoe.Text + "'" +
",N'" + TxtKhoshk.Text + "',N'" + TxtEnergyFa.Text + "'" +
",N'" + TxtCharbi.Text + "',N'" + TxtProtein.Text + "'" +
",N'" + TxtFibr.Text + "',N'" + TxtKhakestar.Text + "'" +
",N'" + TxtKalsium.Text + "',N'" + TxtPhosphor.Text + "'" +
",N'" + TxtPhosphorQ.Text + "',N'" + TxtDryMatter.Text + "'" +
",N'" + TxtEnergyME.Text + "',N'" + TxtEtherExtract.Text + "'" +
",N'" + TxtCrudeProtein.Text + "',N'" + TxtCrudeFiber.Text + "'" +
",N'" + TxtCalcium.Text + "',N'" + TxtTotalPh.Text + "'" +
",N'" + TxtAvaPhosphrous.Text + "',N'" + TxtSodium.Text + "'" +
",N'" + TxtPotassium.Text + "',N'" + TxtChloride.Text + "'" +
",N'" + TxtDCAB.Text + "',N'" + TxtCholine.Text + "'" +
",N'" + TxtLinoleicAcid.Text + "',N'" + TxtLysineTotal.Text + "'" +
",N'" + TxtMethionineTotal.Text + "',N'" + TxtMetCysTotal.Text + "'" +
",N'" + TxtThreonineTotal.Text + "',N'" + TxtTryptophanTotal.Text + "'" +
",N'" + TxtArgenineTotal.Text + "',N'" + TxtIsoleucineTotal.Text + "'" +
",N'" + TxtLeucineTotal.Text + "',N'" + TxtValineTotal.Text + "'" +
",N'" + TxtLysineSID.Text + "',N'" + TxtMethionineSID.Text + "'" +
",N'" + TxtMetCysSID.Text + "',N'" + TxtThreonineSID.Text + "'" +
",N'" + TxtTryptophanSID.Text + "',N'" + TxtArgenineSID.Text + "'" +
",N'" + TxtIsoleucineSID.Text + "',N'" + TxtLeucineSID.Text + "'" +
",N'" + TxtValineSID.Text + "',N'" + TxtAsh.Text + "'" +
",N'" + TxtStarch.Text + "',N'" + TxtSugar.Text + "'" +
",N'" + TxtNFE.Text + "',N'" + TxtTozihKhorak.Text + "'" +
")", 1);

کد برای ویرایش
//ویرایش دیتاگرید

if (RowId != "0")
{
if (
MessageBox.Show("آیا رکورد انتخاب شده ویرایش گردد؟", "ویراش", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{
con.ExecuteNonQuery(
"update Formula set Seriall = N'" +
TxtSerial.Text + "', Tarikh_start = N'" +
dateTimePickerStart.Text + "' , Tarikh_End = N'" +
dateTimePickerEnd.Text + "' , Shomare_Furmula = N'" +
TxtFormul.Text + "', Name_Mahsul = N'" +
ComboMahsul.Text + "', Name_Kala = N'" +
ComboKala.Text + "', Noe = N'" +
ComboNoe.Text + "', Madde_khoshk = N'" +
TxtKhoshk.Text + "', Energy_Fa = N'" +
TxtEnergyFa.Text + "', Charbi = N'" +
TxtCharbi.Text + "', Protein = N'" +
TxtProtein.Text + "', Fibr = N'" +
TxtFibr.Text + "', Khakestar = N'" +
TxtKhakestar.Text + "', Kalsiom = N'" +
TxtKalsium.Text + "', Phosphor_Kol = N'" +
TxtPhosphor.Text + "', Phosphor_qabel = N'" +
TxtPhosphorQ.Text + "', Dry_Matter = N'" +
TxtDryMatter.Text + "', Energy_ME = N'" +
TxtEnergyME.Text + "', Ether_Extract = N'" +
TxtEtherExtract.Text + "', Crude_Protein = N'" +
TxtCrudeProtein.Text + "', Crude_Fiber = N'" +
TxtCrudeFiber.Text + "', Calcium = N'" +
TxtCalcium.Text + "', Total_Ph = N'" +
TxtTotalPh.Text + "', Ava_Phosphrous = N'" +
TxtAvaPhosphrous.Text + "', Sodium = N'" +
TxtSodium.Text + "', Potassium = N'" +
TxtPotassium.Text + "', Chloride = N'" +
TxtChloride.Text + "', DCAB = N'" +
TxtDCAB.Text + "', Choline = N'" +
TxtCholine.Text + "', Linoleic_Acid = N'" +
TxtLinoleicAcid.Text + "', Lysine_Total = N'" +
TxtLysineTotal.Text + "', Methionine_Total = N'" +
TxtMethionineTotal.Text + "', Met_Cys_Total = N'" +
TxtMetCysTotal.Text + "', Threonine_Total = N'" +
TxtThreonineTotal.Text + "', Tryptophan_Total = N'" +
TxtTryptophanTotal.Text + "', Argenine_Total = N'" +
TxtArgenineTotal.Text + "', Isoleucine_Total = N'" +
TxtIsoleucineTotal.Text + "', Leucine_Total = N'" +
TxtLeucineTotal.Text + "', Valine_Total = N'" +
TxtValineTotal.Text + "', Lysine_SID = N'" +
TxtLysineSID.Text + "', Methionine_SID = N'" +
TxtMethionineSID.Text + "', Met_Cys_SID = N'" +
TxtMetCysSID.Text + "', Threonine_SID = N'" +
TxtThreonineSID.Text + "', Tryptophan_SID = N'" +
TxtTryptophanSID.Text + "', Argenine_SID = N'" +
TxtArgenineSID.Text + "', Isoleucine_SID = N'" +
TxtIsoleucineSID.Text + "', Leucine_SID = N'" +
TxtLeucineSID.Text + "', Valine_SID = N'" +
TxtValineSID.Text + "', Ash = N'" +
TxtAsh.Text + "', Starch = N'" +
TxtStarch.Text + "', Sugar = N'" +
TxtSugar.Text + "', NFE = N'" +
TxtNFE.Text + "', Molahezat_Khurak = N'" +
TxtTozihKhorak.Text + "' where ID = '" + RowId + "'", 1);

البته این یکی از فرمها هستش 4تا فرم دیگه مثل این موجوده

Mahmoud.Afrad
سه شنبه 10 آذر 1394, 01:28 صبح
متن خطا رو نزاشتید!
فکر کنم خطا به دلیل تک کوتیشن هایی هست که دو طرف مقادیر عددی قرار دادید.
توی این کد اصلا معلوم نیست کدوم ستون از نوع float هست. و اینو هم در نظر داشته باشید برای مقدار دادن به ستون هایی که از نوع عددی هستند به N' ' نیاز نیست ( ' ' در sql نشاندهنده رشته و کاراکتر هست)

نحوه کد نویسی شما علاوه بر عدم امنیت، مستعد خطای معنایی هم هست. فرض کنید میخواهید عدد 1/5 (یک ممیز پنج در فرمت فارسی) رو در ستون amount ذخیره کنید. خب بعد از الحاق عدد به کوئری، دستور به این شکل در میاد
insert into tbl(amount) values(1/25)
اما در sql / به معنی تقسیم هست و در نتیجه مقدار صحیح 0 ذخیره خواهد شد. برای پرهیز از این نوع اشکالات حتما کوئری رو به صورت پارامتری بنویسید

float amountValue = Convert.ToSingle(textBox1.Text);

_command.CommandText = "insert into tbl(amount) values(@a)";
_command.Parameters.AddWithValue("@a", amountValue);





برای نمایش نقطه . به جای / در اعداد دارای ممیز باید از culture مناسب استفاده کنید. برای تغییر culture میتونید در شروع برنامه در تابع main خط زیر رو اضافه کنید
Application.CurrentCulture = CultureInfo.InvariantCulture;

هر جا به فرمت فارسی نیاز داشتید از کلاس Culture میتونید استفاده کنید.

cnmeysam
سه شنبه 10 آذر 1394, 01:38 صبح
هنوز یک سوال اساسی باقی هستش هیچ راهی وجود نداری که بگیم تکست باکسهای ما همشون از نوع float هستن؟ شاید با این کار کلا مشکل حل بشه؟!!!!

cnmeysam
سه شنبه 10 آذر 1394, 01:52 صبح
متن خطا رو نزاشتید!
فکر کنم خطا به دلیل تک کوتیشن هایی هست که دو طرف مقادیر عددی قرار دادید.
توی این کد اصلا معلوم نیست کدوم ستون از نوع float هست. و اینو هم در نظر داشته باشید برای مقدار دادن به ستون هایی که از نوع عددی هستند به N' ' نیاز نیست ( ' ' در sql نشاندهنده رشته و کاراکتر هست)

نحوه کد نویسی شما علاوه بر عدم امنیت، مستعد خطای معنایی هم هست. فرض کنید میخواهید عدد 1/5 (یک ممیز پنج در فرمت فارسی) رو در ستون amount ذخیره کنید. خب بعد از الحاق عدد به کوئری، دستور به این شکل در میاد
insert into tbl(amount) values(1/25)
اما در sql / به معنی تقسیم هست و در نتیجه مقدار صحیح 0 ذخیره خواهد شد. برای پرهیز از این نوع اشکالات حتما کوئری رو به صورت پارامتری بنویسید

float amountValue = Convert.ToSingle(textBox1.Text);

_command.CommandText = "insert into tbl(amount) values(@a)";
_command.Parameters.AddWithValue("@a", amountValue);





برای نمایش نقطه . به جای / در اعداد دارای ممیز باید از culture مناسب استفاده کنید. برای تغییر culture میتونید در شروع برنامه در تابع main خط زیر رو اضافه کنید
Application.CurrentCulture = CultureInfo.InvariantCulture;

هر جا به فرمت فارسی نیاز داشتید از کلاس Culture میتونید استفاده کنید.
مشکل من هنگام ثبت اولیه نیست هنگام ثبت اولیه درست ثبت میشه ولی وقتی تو دیتا گرید انتخاب میکنم که ویرایشش کنم خطا میده که نتونست تو دیتابیس ثبت کنه چون موقع ثبت اولیه 1.5 رو میزنم ولی موقع لود کردن تو تکست باکسها برای ویرایش 1/5 رو لود میکنه اصلا مشکلی با فارسی یا انگلیسی بودنش هم ندارم موضوع اینه که تو ویندوز xp و 7 آیتم decimal symbol داخل کنترل پنل . هست ولی رو ویندوز 10 آیتم decimal symbol تبدیل شده به / و هنگام لود کردن جای . میاد / لود میکنه
در ضمن میشه بیشتر توضیح بدین چرا گفتین عدم امنیت؟!

cnmeysam
سه شنبه 10 آذر 1394, 02:06 صبح
از
Application.CurrentCulture = CultureInfo.InvariantCulture;
هم نمیتونم استفاده کنم چون جدا کننده تقویمم رو بهم میریزه و باز هم موقع لود تو dateTimePickerStart ارور میده بنظر خود من منطقی ترین راهش اینه که دستوری نوشته بشه که هنگام لود فرم بگیم decimal symbol ویندوز رو چک کنه و اگه / بود اون رو تبدیل به . کنه اونوقت کل مشکل حل میشه
اصلا راهی هست که بشه اینکار رو انجام داد؟ چون همونطور که دوستمون abdullah20 تو عکس گذاشتن با عوض کردن اون آیتم کلا مشکل حل میشه

Mahmoud.Afrad
سه شنبه 10 آذر 1394, 04:46 صبح
خب، پس هنگام ارسال داده به جدول براساس جداکننده ای که در رشته هست باید تبدیل انجام بشه.
برای دقت و راحتی و دسته بندی کدها یک کلاس و توی اون متد استاتیک ایجاد کنید برای دریافت رشته و تحویل گرفتن عدد با نوع مناسب.
هر جا خواستید رشته به عدد تبدیل بشه کافیه از متد استفاده کنید.
مثلا یک کلاس به صورت زیر به پروژه اضافه کنید

public static class ConvertHelper
{
public static float StringToFloat(this string strNumber)
{
float output = 0;
bool isInCorrectFormat = false;
System.Globalization.NumberStyles style = System.Globalization.NumberStyles.Float;

foreach (var c in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
if (float.TryParse(strNumber, style, c, out output))
{
isInCorrectFormat = true;
break;
}
}
if (!isInCorrectFormat)
{
throw new FormatException();
}
return output;
}
}

متد StringToFloat بر همه cultureها رو امتحان میکنه و هر کدوم جواب داد مقدار رو برمیگردونه.
به صورت زیر هم میتونید استفاده کنید

_command.CommandText = "insert into tbl(amount) values(@a)";

try
{
float amountValue = textBox1.Text.StringToFloat();
_command.Parameters.AddWithValue("@a", amountValue);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


این رو هم مد نظر قرار بدید که دوباره این عدد رو به رشته تبدیل و یا به رشته الحاق نکنید چون دوباره همون مشکل ایجاد میشه. پس حتما به صورت پارامتری مقادیر رو ارسال کنید.

و اینکه میگید حجم کارتون زیاد میشه ، اگر لایه منطق رو از لایه دسترسی به داده ها جدا میکردید تغییرات کمتری نیاز بود.