دسته بندی ها
01:46 1400/01/01

جمع مقادیر یک ستون در دیتاگریدویو در WPF

مشخصات سوال کننده :
کاربر : Alireza     امتیاز کاربر : 115     رتبه کاربر : 13
دسته بندی : سی شارپ WPF

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 2670
پاسخ دهنده : hamid_b 23:34 1400/01/01

رفع خطای Specified argument was out of the range of valid values

دو احتمال وجود داره :

احتمال اول : خب در واقع خطای شما این هست که شما یک متغیر به نام Sum از نوع double تعریف کردید و در یک حلقه for مقادیر رو داخلش ریختید و با هم جمع کردید. ولی احتمالا مبالغی که شما دارید و با هم جمع زدید مبلغ بسیار بزرگی هست و مقدارش بیشتر از مقدار یک متغیر double شده.

احتمال دوم : احتمال دوم که بیشتر باید بهش دقت کنید این هست که ممکنه در Position با شماره 0 که خطای شما هم در همون خط هست مقداری وجود نداره و در واقع مقادیر از 1 شروع میشه. یعنی توی حلقه i رو از 1 شروع کنید. لینک زیر رو بخونید بهتر متوجه می شید.

Specified argument was out of the range of valid values

به این پاسخ امتیاز بدهید    1
امتیاز: 510 رتبه: 4
1 نظر
Alireza : ممنون از لطفتون که به سوالم جواب دادین. مبالغم کمه چند نوع متغیر هم امتحان کردم جواب نداده بود برا همین سوال پرسیدم نمیدونم چکار کنم توی نت هم خیلی گشتم چیزی بدست نیاوردم

امتیاز کاربر : 115   رتبه کاربر : 13   تاریخ ثبت : 01:16 1400/01/02
پاسخ دهنده : Sowgandi 10:17 1400/01/02

با سلام و احترام.

دوست گرامی مشکل شما به این دلیل هست که شما حلقه for رو مستقیما روی سلولهای دیتاگرید قرار دادید که این امر کاملا اشتباه است. اولا دلیل خطا اینه که دیتاگریدها به یکدفعه کل دیتاسورس خودشو  لود نمیکنه مگر اینه خاصیت EnableRowVirtualization دیتاگرید رو برابر با false قرار بدید که این کار هم اشتباه هست چون سرعت لود دیتاگرید در سلکت های سنگین به شدت پایین میاد. ثانیا این روشی که برای بدست آوردن جمع یک ستون استفاده کردید اصلا درست نیست! لطفا به روش زیر عمل کنید.

فرض بر این میگیریم که دیتاگرید شما به جدولی با نام Users متصل هست و یک ستون هم در دیتاگرید دارید با نام Fee که میخواهید جمع این ستون رو در لیبل نشون بدید. 

 double TotalFee = Convert.ToDouble(db.Users.Sum(x => x.Fee));

در کد بالا db همون نام شیء دیتابیسی هست که تعریف کردید. حالا کافیه مقدار TotalFee رو توی لیبل خودتون بریزید. اگر میخواهید در زمان فیلتر کردن دیتاگرید دقیقا همون جمع موارد فیلتر شده رو نشون بده در کد بالا به جای db.Users همون مقدار دیتاسورسی رو قرار بدید که به دیتاگرید متصل کردید.

ویرایش شده در دوشنبه 2 فروردین 1400 ساعت 10:24:12
به این پاسخ امتیاز بدهید    2
امتیاز: 871 رتبه: 3
1 نظر
Alireza : ممنون از جواب عالی لطف میکنین یه نمونه از کدی که فرستادین رو با دیتا سورس به جای db.Users بفرستین؟

امتیاز کاربر : 115   رتبه کاربر : 13   تاریخ ثبت : 11:44 1400/01/02
پاسخ دهنده : Sowgandi 12:20 1400/01/02

شما خب دیتاگرید خودتون رو با یک کوئری بایند کردید دیگه. احتمالا به شکل زیر

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 همون دیتاسورسی هست که به دیتاگرید متصل شده. دو خط آخر کد بالا رو دقیقا زیر قسمتی که دیتاگرید رو بایند کردید قرار بدید فقط بجای مقادیر تستی مقادیر خودتون رو قرار بدید.

بازم اگه موفق نشدید کدهایی که نوشتین رو قرار بدید تا روی کدهای خودتون مثال بزنم.

ویرایش شده در دوشنبه 2 فروردین 1400 ساعت 12:21:22
به این پاسخ امتیاز بدهید    2
امتیاز: 871 رتبه: 3
3 نظر
Alireza : دستتون درد نکه عزیز حل شد

امتیاز کاربر : 115   رتبه کاربر : 13   تاریخ ثبت : 04:11 1400/01/02
Sowgandi : خواهش میکنم

امتیاز کاربر : 871   رتبه کاربر : 3   تاریخ ثبت : 05:01 1400/01/02
Alireza : سلام اگه لطف کنین به این سوال هم پاسخ بدین https://porsnet.ir/showQuestion/1911/%D9%86%D8%AD%D9%88%D9%87-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%81%D8%B1%D9%85-%DA%AF%D8%B1%D8%AF%D8%B4-%D8%AD%D8%B3%D8%A7%D8%A8-%D9%85%D8%B4%D8%AA%D8%B1%DB%8C-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE

امتیاز کاربر : 115   رتبه کاربر : 13   تاریخ ثبت : 07:19 1400/01/02
ادامه نظرات ...
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود