PDA

View Full Version : رویداد مربوط به سلول های datagrid view



ali_mnkt
چهارشنبه 30 بهمن 1387, 13:58 عصر
سلام به همه

یک ستون از datagridview من برای وارد کردن قیمت اجناس خالی هستش

که کاربر قیمت ها رو وارد می کنه حالا هنگام وارد کردن قیمت باید اعداد به صورت 3رقم 3رقم

جدا شن(توجه کنید که سلول مشخصی از datagridview مثلا ستون 2 و همچنین هنگام وارد

کردن اعداد) چی کار باید کنم؟

anooshiran
چهارشنبه 30 بهمن 1387, 18:19 عصر
سلام به همه

یک ستون از datagridview من برای وارد کردن قیمت اجناس خالی هستش

که کاربر قیمت ها رو وارد می کنه حالا هنگام وارد کردن قیمت باید اعداد به صورت 3رقم 3رقم

جدا شن(توجه کنید که سلول مشخصی از datagridview مثلا ستون 2 و همچنین هنگام وارد

کردن اعداد) چی کار باید کنم؟


سلام دوست عزيز

با كد زير


DataGridView1.Columns(2).DefaultCellStyle.Format = "n0"

امكان پذير هست. ولي به اين شرط كه DataPropertyName اين ستون برابر فيلد عددي جدول متصل باشه.

اگر برات واضح نيست بيشتر توضيح بدم .البته n باعث ايجاد seperator و عدد كناري DecimalPlace است

ali_mnkt
پنج شنبه 01 اسفند 1387, 01:21 صبح
مرسی دوست عزیز از توجهت

البته من به این کد هم احتیاج داشتم ولی مشگل اصلی من اینجاست که وقتی کاربر اعداد رو

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

البته من از همین سایت طریقه ی جدا سازی اعداد درون textbox و هنگام وارد کردن اعداد رو

گرفتم و با تغییر در خاصیت سلول های datagrid view که اونها هم از نوع textbox هستن

خواستم این ویژگی رو به ستون datagrid view اضافه کنم کدش به c# هست



private void button1_Click(object sender, EventArgs e)
{


this.dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(data GridView1_EditingControlShowing);


}


void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{


if (e.Control is TextBox)
{


TextBox tb = e.Control as TextBox;



tb.TextChanged += new System.EventHandler(text_chang);
}



}






//makhsose 3ragham 3ragham kardan
private void text_chang(object sender, EventArgs e)
{

try
{


NumberFormatInfo nfi = new NumberFormatInfo();
textBox1.Text= long.Parse(textBox1.Text, NumberStyles.Number).ToString("N0", nfi);

textBox1.Select(textbox1.Text.Length, 0);
}
catch
{
textBox1.Text = "";
}
}

حالا اینجا یه مشگل هستش توی تابع text_chang (که کد جدا سازی همون textbox هستش

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

باید در tb که طبق کد از کلاس textbox است و سلول های datagrid view هم از این نوع

هستش انجام بده ولی نمی دونم چطوری؟ من سعی کردم کامل مشگل رو توضیح بدم

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

دیگه ای به نظرت می رسه؟


راستی می شه در مورد "n0" یه کم بیشتر توضیح بدی ؟

anooshiran
پنج شنبه 01 اسفند 1387, 06:27 صبح
سلام دوست عزيز

كدي را كه به #C قيد كرده بودي هم به vb وهم به #C تصحيح كردم.

به هر صورت چند تا مشكل داشت كه حل كردم
1- اصلا به button1_click نيازي نيست چون وقتي وارد cell ميشوي بلافاصله بايد event DataGridView1.EditingControlShowing اتفاق بيافتد.
2- Handles DataGridView1.EditingControlShowing را مستقيما يه sub خودش متصل كن
3- از TextBox1 نمي تواني استفاده كني ، چون تكست باكس خود يك كنترل كاملا مجزاست و تو فقط دنبال اين هستي كه خاصيت TextChange رو به گريد بدهي. بنابر اين به جاي TextBox1.Text بايد از sender.Text استفاده كني كه sender خود خاصيت تكست باكس را داراست

در ضمن "n0" :
اين يك قالب بندي است كه در format يا style بكار ميرود. n يا Numeric مشخص مي كند كه قالب كنترل عددي يا اصطلاحا نمره اي است و عدد 0 جايگاه decimalplace را نشان ميدهد . مثلا اگر 0 را تبديل به يك كني هميشه يك رقم اعشاري به انتهاي عدد اضافه مي شود بنابراين 0 بدين معني است كه اين عدد اعشار ندارد.
vb:


PrivateSub dataGridView1_EditingControlShowing(ByVal sender AsObject, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing
IfTypeOf e.Control Is TextBox Then
Dim tb As TextBox = TryCast(e.Control, TextBox)
AddHandler tb.TextChanged, AddressOf text_chang
EndIf
EndSub
'makhsose 3ragham 3ragham kardan
PrivateSub text_chang(ByVal sender AsObject, ByVal e As EventArgs)
Try
Dim nfi AsNew Globalization.NumberFormatInfo()
sender.Text = Long.Parse(sender.Text, Globalization.NumberStyles.Number).ToString("n0", nfi)
sender.[Select](sender.Text.Length, 0)
Catch
sender.Text = ""
EndTry
EndSub



#C:


private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control is TextBox) {
TextBox tb = e.Control as TextBox;
tb.TextChanged += text_chang;
}

}
//makhsose 3ragham 3ragham kardan
private void text_chang(object sender, EventArgs e)
{
try {
Globalization.NumberFormatInfo nfi = new Globalization.NumberFormatInfo();
sender.Text = long.Parse(sender.Text, Globalization.NumberStyles.Number).ToString("n0", nfi);
sender.Select(sender.Text.Length, 0);
}
catch {
sender.Text = "";
}
}



اميدوارم با اين كد مشكلت حل شده باشد.
اگر باز هم موردي بود در خدمت هستم.

ali_mnkt
جمعه 02 اسفند 1387, 00:25 صبح
سلام دوست عزيز

كدي را كه به #C قيد كرده بودي هم به vb وهم به #C تصحيح كردم.

به هر صورت چند تا مشكل داشت كه حل كردم
1- اصلا به button1_click نيازي نيست چون وقتي وارد cell ميشوي بلافاصله بايد event DataGridView1.EditingControlShowing اتفاق بيافتد.
2- Handles DataGridView1.EditingControlShowing را مستقيما يه sub خودش متصل كن
3- از TextBox1 نمي تواني استفاده كني ، چون تكست باكس خود يك كنترل كاملا مجزاست و تو فقط دنبال اين هستي كه خاصيت TextChange رو به گريد بدهي. بنابر اين به جاي TextBox1.Text بايد از sender.Text استفاده كني كه sender خود خاصيت تكست باكس را داراست

در ضمن "n0" :
اين يك قالب بندي است كه در format يا style بكار ميرود. n يا Numeric مشخص مي كند كه قالب كنترل عددي يا اصطلاحا نمره اي است و عدد 0 جايگاه decimalplace را نشان ميدهد . مثلا اگر 0 را تبديل به يك كني هميشه يك رقم اعشاري به انتهاي عدد اضافه مي شود بنابراين 0 بدين معني است كه اين عدد اعشار ندارد.
vb:


PrivateSub dataGridView1_EditingControlShowing(ByVal sender AsObject, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing
IfTypeOf e.Control Is TextBox Then
Dim tb As TextBox = TryCast(e.Control, TextBox)
AddHandler tb.TextChanged, AddressOf text_chang
EndIf
EndSub
'makhsose 3ragham 3ragham kardan
PrivateSub text_chang(ByVal sender AsObject, ByVal e As EventArgs)
Try
Dim nfi AsNew Globalization.NumberFormatInfo()
sender.Text = Long.Parse(sender.Text, Globalization.NumberStyles.Number).ToString("n0", nfi)
sender.[Select](sender.Text.Length, 0)
Catch
sender.Text = ""
EndTry
EndSub

#C:


private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control is TextBox) {
TextBox tb = e.Control as TextBox;
tb.TextChanged += text_chang;
}

}
//makhsose 3ragham 3ragham kardan
private void text_chang(object sender, EventArgs e)
{
try {
Globalization.NumberFormatInfo nfi = new Globalization.NumberFormatInfo();
sender.Text = long.Parse(sender.Text, Globalization.NumberStyles.Number).ToString("n0", nfi);
sender.Select(sender.Text.Length, 0);
}
catch {
sender.Text = "";
}
}

اميدوارم با اين كد مشكلت حل شده باشد.
اگر باز هم موردي بود در خدمت هستم.






من کد رو امتحان کردم اما در text_chang پارامتر sender مثل e هیچ property ای نداشت

یعنی نه sender.text و نه sender.select وجود نداشت !!!

ali_mnkt
شنبه 03 اسفند 1387, 00:19 صبح
آیا راه دیگه ای وجود نداره ؟

anooshiran
شنبه 03 اسفند 1387, 05:45 صبح
سلام دوست عزيز

اين پروزه كوچك را دانلود كن . نحوه كامل Seperator گذاشتن براي يك ستون عددي را خواهي ديد.

باز هم اگر مسشكلي بود در خدمت هستم

ali_mnkt
شنبه 03 اسفند 1387, 14:38 عصر
با سلام مجدد

دستت درد نکته وقتی دیدم برنامت کار کرد و اعداد رو جدا کرد خیلی حال کردم :قلب::قلب:

ولی وقتی خواستم تو برنامم اجرا کنم باز همون error قدیمی که می گه sende شامل text و

select نیست دوباره حالمو گرفت من که سر در نمی یارم چرا error می گیره ولی تو برنامه ی

شما error نداره :گریه::گریه:

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

مشگلشو کشف کنی ؟

البته کد نمونه با c# 2008 هستش

ali_mnkt
شنبه 03 اسفند 1387, 15:35 عصر
فایل برنامه یادم رفته بود

اینم فایل برنامه

ali_mnkt
یک شنبه 04 اسفند 1387, 00:58 صبح
کجای کار اشتباهه ؟