سلام دوستان
من یک دیتاگرید توی محیط WPF دارم و یک ستون به نام مبلغ هستش که میخوام جمع مبالغ ستون رو به دست بیارم و بریزم توی یک لیبل،
این کد رو نوشتم اما خطا میده
double sum = 0;
for (int i = 0; i < dgPart.Items.Count; i++)
{
sum += Convert.ToDouble((dgPart.SelectedCells[4].Column.GetCellContent(i) as TextBlock).Text);
}
lblInvoicePrice.Content = sum.ToString();
اینم خطا:
Additional information: Specified argument was out of the range of valid values.
که برای این خط کد میگیره
sum += Convert.ToDouble((dgPart.SelectedCells[0].Column.GetCellContent(i) as TextBlock).Text);
دو احتمال وجود داره :
احتمال اول : خب در واقع خطای شما این هست که شما یک متغیر به نام Sum از نوع double تعریف کردید و در یک حلقه for مقادیر رو داخلش ریختید و با هم جمع کردید. ولی احتمالا مبالغی که شما دارید و با هم جمع زدید مبلغ بسیار بزرگی هست و مقدارش بیشتر از مقدار یک متغیر double شده.
احتمال دوم : احتمال دوم که بیشتر باید بهش دقت کنید این هست که ممکنه در Position با شماره 0 که خطای شما هم در همون خط هست مقداری وجود نداره و در واقع مقادیر از 1 شروع میشه. یعنی توی حلقه i رو از 1 شروع کنید. لینک زیر رو بخونید بهتر متوجه می شید.
با سلام و احترام.
دوست گرامی مشکل شما به این دلیل هست که شما حلقه for رو مستقیما روی سلولهای دیتاگرید قرار دادید که این امر کاملا اشتباه است. اولا دلیل خطا اینه که دیتاگریدها به یکدفعه کل دیتاسورس خودشو لود نمیکنه مگر اینه خاصیت EnableRowVirtualization دیتاگرید رو برابر با false قرار بدید که این کار هم اشتباه هست چون سرعت لود دیتاگرید در سلکت های سنگین به شدت پایین میاد. ثانیا این روشی که برای بدست آوردن جمع یک ستون استفاده کردید اصلا درست نیست! لطفا به روش زیر عمل کنید.
فرض بر این میگیریم که دیتاگرید شما به جدولی با نام Users متصل هست و یک ستون هم در دیتاگرید دارید با نام Fee که میخواهید جمع این ستون رو در لیبل نشون بدید.
double TotalFee = Convert.ToDouble(db.Users.Sum(x => x.Fee));
در کد بالا db همون نام شیء دیتابیسی هست که تعریف کردید. حالا کافیه مقدار TotalFee رو توی لیبل خودتون بریزید. اگر میخواهید در زمان فیلتر کردن دیتاگرید دقیقا همون جمع موارد فیلتر شده رو نشون بده در کد بالا به جای db.Users همون مقدار دیتاسورسی رو قرار بدید که به دیتاگرید متصل کردید.
شما خب دیتاگرید خودتون رو با یک کوئری بایند کردید دیگه. احتمالا به شکل زیر
var ds = db.Database.SqlQuery<Users>("select * from Users").ToList();
Datagrid.ItemsSource = ds;
double TotalFee = Convert.ToDouble(ds.Sum(x => x.Fee));
Mylable.Content = TotalFee;
تو کد بالا ds همون دیتاسورسی هست که به دیتاگرید متصل شده. دو خط آخر کد بالا رو دقیقا زیر قسمتی که دیتاگرید رو بایند کردید قرار بدید فقط بجای مقادیر تستی مقادیر خودتون رو قرار بدید.
بازم اگه موفق نشدید کدهایی که نوشتین رو قرار بدید تا روی کدهای خودتون مثال بزنم.
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1161
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
599
- پاسخ :
1
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
350
- پاسخ :
1
|
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
319
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
01:58:00 PM
- بازدید :
4271
- پاسخ :
1
|
تاریخ :
1398/09/16
- ساعت :
11:41:00 AM
- بازدید :
4284
- پاسخ :
1
|
تاریخ :
1398/09/07
- ساعت :
02:15:00 PM
- بازدید :
3877
- پاسخ :
5
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
662
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3174
- پاسخ :
2
|
تاریخ :
1398/09/08
- ساعت :
11:38:00 PM
- بازدید :
3251
- پاسخ :
1
|
تاریخ :
1401/02/24
- ساعت :
02:17:00 PM
- بازدید :
2013
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
80
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
114
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1034
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
431
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
931
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1357
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4800
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1161
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
599
- پاسخ :
1
|