ورود

View Full Version : نحوه نمایش اعداد به شکل خاص در DataGrid در WPF



کامبیز اسدزاده
جمعه 22 اردیبهشت 1391, 14:37 عصر
سلام

کسی از دوستان میدونه چجوری میشه یک مقدار رو روی DataGrid چطوری به یه شکل خاص نمایش داد ؟

مثال : من فیلد Currency رو با نوع Decimal ایجاد کردم و با دستوراتی در بخش TextChange به صورت 3 رق 3 رقم جداش میکنم و ذخیره میکنم.

حالا برای مثال مقدار 1,200,000 رو تو هنگام ارسال نمایش داده و ارسال میکنم. و این مقدار در دیتابیس به صورت 1200000 ذخیره میشه.

حالا میخوام همین مقدار رو روی DataGrid به صورت 3 رقم جدا نمایش بدم. کسی میتونه راهنمایی کنه ؟

مهدی فرزاد
شنبه 23 اردیبهشت 1391, 08:06 صبح
سلام
شما باید از Converter استفاده کنید
به این شکل که یک کلاس درست میکنید که از IValueConverter مشتق میشه

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


class MonyConvertor : IValueConverter
{

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{

string str = (value != null ? value.ToString() : string.Empty);
if (str.Trim() != string.Empty)
{
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalDigits = 0;
decimal d = 0;
if (decimal.TryParse(str.Trim(), out d))
{
str = decimal.Parse(str.Trim(), NumberStyles.AllowThousands).ToString("N", nfi);
if (str.IndexOf(',') > 0)
str = str.Replace(",", "،");
}
}
if (String.IsNullOrEmpty(str) == true)
return str;
else
return str + " ریال";
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string str = (value != null ? value.ToString() : string.Empty);
if (str.Trim() != string.Empty)
{
if (str.IndexOf('،') >= 0)
return str.Trim().Replace("،", String.Empty);
else
return str;
}
return str;

}
}


حالاباید از این کلاس به شکل زیر در Binding استفاده کنید
xmlns:local="clr-namespace:MyAppName"
<Window.Resources>
<local:MonyConvertor x:Key="MonyConvertor"/>
</Window.Resources>
<DataGridTextColumn IsReadOnly="True" Header="مبلغ" Binding="{Binding Cost, Converter={StaticResource MonyConvertor}}" MinWidth="120"/>

mze666
شنبه 23 اردیبهشت 1391, 11:51 صبح
خیلی ممنون آقای Mehdi550u این پست خیلی به من کمک کرد. این کار توی Datagrid یا TextBlock و ... جواب میده ولی توی TextBox (وقتی میخوایم عدد رو وارد کنیم) رقم ها رو قاطی میکنه. میشه در مورد TextBox هم بگید که چکار باید کرد که وقتی همونجا کاربر تایپ میکنه 3 رقم 3رقم جداکنه؟

خیلی ممنون

مهدی فرزاد
شنبه 23 اردیبهشت 1391, 13:17 عصر
سلام
برای تکس باکس میتونید از این TextBox که آماده کردم و ضمیمه کردم استفاده کنید
اونو به پروژه اضافه کنید
یک بار پروژه رو Build کنید
و کد Xaml رو به شکل زیر بنویسید
xmlns:local="clr-namespace:Mehdi"
<local:MyTextBox x:Name="myText" HorizontalAlignment="Center" VerticalAlignment="Top" Width="198" Height="25" TextAlignment="Center" MonyText="True" MaxLength="16"/>

دقت کنید که خاصیت MonyText برابر True باشه و برای خوندن اعداد از خاصیت GetText استفاده کنید که اعداد رو دست برمیگردونه
پ و : خاصیت GetText از نوع DependencyProperty نیست و نمیتونید Bind کنید اگر دوست دارید خودتون این خاصیت رو از نوع DependencyProperty بسازید و بعد میتونید اونو Bind کنید
یک راه فرعی:
میتونید در انتهای کار قبل از ثبت بر اساس خاصیت GetText این کنترل مقدار دهی نهایی رو انجام بدید مثلا
(this.grid.DataContext as Table1).Cost = int.Parse(This.myText.GetText);

کامبیز اسدزاده
شنبه 23 اردیبهشت 1391, 13:27 عصر
ممنون از راهنمایی ولی من نتونستم ازش استفاده کنم !



xmlns:local="clr-namespace:MyAppName"
<Window.Resources>
<local:MonyConvertor x:Key="MonyConvertor"/>
</Window.Resources>
<DataGridTextColumn IsReadOnly="True" Header="مبلغ" Binding="{Binding Cost, Converter={StaticResource MonyConvertor}}" MinWidth="120"/>




تو این قسمت به <local:MonyConvertor x:Key="MonyConvertor"/> ایراد میگیره.

The "MoneyConvertor" does not exist in the namesace "clr-namespace:-----"//Error vase in gesmate

مهدی فرزاد
شنبه 23 اردیبهشت 1391, 13:41 عصر
سلام
دقت کنید MyAppName نام پیشفرض هست که من گذاشتم شما توی پروژه خودتون باید برید ببینید این کلاس رو توی چه فضای نامی ایجاد کردید نام اون فضای نام رو بگذارید

کامبیز اسدزاده
شنبه 23 اردیبهشت 1391, 13:47 عصر
بله درسته من دقیقا نام پروژم رو گذاشتم و زیر شاخه پروژه Clasess دارم یعنی Myapp.Classes و داخل اونهم کلاس MonyConvertor.cs رو دارم. ولی خطا همینو میده که گفتم.

کامبیز اسدزاده
شنبه 23 اردیبهشت 1391, 16:10 عصر
حل شد مهندس متشکر. :)

mze666
شنبه 23 اردیبهشت 1391, 16:42 عصر
اینم خیلی عالی بود. اگر DependencyProperty هم میتونستم (بلد بودم) بذارم توش که قابلیت بایند هم داشت که دیگه فوق العاده بود. ولی بازم همینم خوبه. خیلی ممنون