دسته بندی ها
22:47 1398/10/03

شمارش و جمع مقادیر یک ستون در Datagrid به همراه شرط در WPF

مشخصات سوال کننده :
کاربر : vahdat     امتیاز کاربر : 289     رتبه کاربر : 5
دسته بندی : WPF

به این سوال امتیاز بدهید    3
تعداد بازدید این سوال : 5635
پاسخ دهنده : Sowgandi 08:10 1398/10/04

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

به فرض اینکه شماره اندکس ستون شرطی شما 5 باشه یعنی ششمین ستون در دیتاگرید و خروجی مقدار ستون هم از نوع رشته "فعال" و "غیرفعال" باشه.

    int Count = 0;
                foreach (var item in MyDataGrid.Items)
                {
                    string ActiveColumns = (MyDataGrid.SelectedCells[5].Column.GetCellContent(item) as TextBlock).Text;
                    if (ActiveColumns == "فعال") { Count += 1; }
                }

                int ActiveCount = Count;
                int InactiveCount = MyDataGrid.Items.Count - Count;

در کد بالا ActiveCount مقدار ردیف های فعال و InactiveCount مقدار ردیف های غیرفعال رو شمارش میکنه.

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

موفق باشید.

به این پاسخ امتیاز بدهید    2
امتیاز: 871 رتبه: 3
پاسخ دهنده : vahdat 15:11 1398/10/04

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

به این پاسخ امتیاز بدهید    3
امتیاز: 289 رتبه: 5
پاسخ دهنده : hamid_b 16:54 1398/10/04

البته اشتباه نبابد بشه

 

اگر شما در کوئری که به دیتابیس میفرستید همه اطلاعات رو دارید دیگه‌نیازی نیست مجدد کوئری بفرستید و میتونید همونجا اطلاعات رو بدست بیارید.

مثلا

 

int numActive = dgTajhiz.Items.where(t => t.Status ==1).Count

 

در کوئری بالا فرض شده که دستگاههای فعال و غیرفعال توسط فیلد Status از هم جدا میشن.

به این ترتیب در کوئری بالا تعداد فعالها بدست میاد.

برای غیر فعالها هم میشه به همین ترتیب انجام داد

به این پاسخ امتیاز بدهید    0
امتیاز: 510 رتبه: 4
پاسخ دهنده : vahdat 18:00 1398/10/04

کمی گیج شدم الان

ببینید من توو کوئری که به دیتابیس برای دیتاگرید میزنم همیشه اطلاعات مورد نیازم رو به دیتا گرید میارم 

و اگه هم فیلتری روی دیتا گرید بزنم با کوئری فیلتر میکنم 
حالا با این اوصاف برای ردیف مجموع که با استفاده از چند تا تکس باکس میخوام نمایش بدم از دیتاگرید استفاده کنم 
یا 
برای اونها  هم با کوئری از دیتابیس بگیرم ؟؟؟

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

 

خواستم از 

int numActive = dgTajhiz.Items.where(t => t.Status ==1).Count

استفاده کنم متد Where نداشت !؟

ویرایش شده در چهارشنبه 4 دی 1398 ساعت 18:36:23
به این پاسخ امتیاز بدهید    3
امتیاز: 289 رتبه: 5
پاسخ دهنده : Sowgandi 18:59 1398/10/04

برای سلکت زدن از دیتاگرید باید از حلقه for یا foreach استفاده کرد.  ولی از اونجایی که برنامه شما تحت شبکه هست بازم توصیه میکنم از سلکت دیتابیس استفاده کنید تا در صورت تغییر در دیتابیس توسط کلاینت ها، همیشه آخرین تغییرات رو داشته باشید.

ویرایش شده در چهارشنبه 4 دی 1398 ساعت 19:00:07
به این پاسخ امتیاز بدهید    2
امتیاز: 871 رتبه: 3
پاسخ دهنده : saedbfd 19:59 1398/10/04

با سلام

 

بهتر بود کدهای خودتون و خروجی کار رو کامل نمایش میدادید تا سایر برنامه‌نویسان با دید بازتری پاسخ بدن.

 

الان مشخص نیست تعداد تجهیزات فعال غیر فعال که شما گفتید توی کوئری شما وجود داره یا خیر.

ویرایش شده در پنج شنبه 5 دی 1398 ساعت 21:36:35
به این پاسخ امتیاز بدهید    0
امتیاز: 1654 رتبه: 1
پاسخ دهنده : vahdat 23:38 1398/10/04

 این کد

        /// ////متد ارتباط با پایگاه داده و نمایش اطلاعات در دیتاگرید
        private void ShowTajhizInfo(Func<string> SearchStringForTajhizs)
        {
            var query = DbVahdat.Database.SqlQuery<ViewTajhiz>
                ("SELECT TajhizID, Tajhiz, Mahal, TarikhNasb, Andaze, TajhizVazn, Zarfiyat, TarikhSakht, HalattajhizOlaviyat, TajhizTozih, Bakhsh, UserFamili, Sazande FROM ViewTajhiz Where 1=1 " 
                + SearchStringForTajhizs());

            //MessageBox.Show(query.ToString());

            var q = query.ToList();
            dgTajhiz.ItemsSource = q;
            RowSum();
        }

اینم دیتا گریدم

 

 

به این پاسخ امتیاز بدهید    3
امتیاز: 289 رتبه: 5
پاسخ دهنده : Nori 23:46 1398/10/04

این لینک رو ببینید و اینو

به این پاسخ امتیاز بدهید    3
امتیاز: 72 رتبه: 15
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود