PDA

View Full Version : سوال: مشکل با paging گریدویو تلکریک وقتی دیتا سورس از نوع linq datasource است



bahareh1368
دوشنبه 01 اسفند 1390, 23:11 عصر
سلام به همگی.
دوستان من با صفحه بندی گرید ویوی تلریک مشکل دارم و میدونم که مشکل از linqdatasource است که به گرید وصل شده. برای رفع مشکل باید چی کار کنم؟ اینم عکس خطایی که نشون میده

83010

Saman Hashemi
سه شنبه 02 اسفند 1390, 08:13 صبح
خودش راه حل گفته دیگه وقتی از متد skip استفاده میکنی باید اطلاعات مرتب شده باشند برای این کار باید از order by استفاده کنی براساس یکی از فیلدها اطلاعات مرتب کنی...!

bahareh1368
سه شنبه 02 اسفند 1390, 08:54 صبح
خودش راه حل گفته دیگه وقتی از متد skip استفاده میکنی باید اطلاعات مرتب شده باشند برای این کار باید از order by استفاده کنی براساس یکی از فیلدها اطلاعات مرتب کنی...!

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

sanay_esh
سه شنبه 02 اسفند 1390, 09:23 صبح
سلام و خسته نباشید
با عرض پوزش از آقای سامان هاشمی که استاد ما هستند

بنده به این مشکل خیلی قبلا ها خورده بودم که بعد از تحقیقات در سایت خود تلریک بدین شکل تونستم مشکل را حل کنم
(در ضمن این کد هم معادل جستجوی بین تاریخ در sql است که بصورت Linq to Entity نوشته شده است )
ابتدا :

var sublist = from m in DataContext.MyTable
where string.Compare(m.f1, txtfdate.Text)) > -1 && string.Compare(m.f1, txttodate.Text) < 1
select m;
ViewState["GridDS"] = sublist.ToList();
RadGrid1.DataSource = ViewState["GridDS"];
RadGrid1.DataBind();

و در ادامه :
protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
if (IsPostBack)
{
RadGrid1.DataSource = ViewState["GridDS"];
}
}

bahareh1368
سه شنبه 02 اسفند 1390, 09:29 صبح
خیلی ممنونم ازت. اما میشه بگی این کوئری چی کار میکنه؟

من در رویداد selecting لینک دیتا سورسم اینو نوشتم :

protected void dsProducts_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
e.Result = from p in DataContext.context.Products
join pg in DataContext.context.ProductGroups on p.ProductGroupID equals pg.ProductGroupID
select new
{
p.ProductID,
p.ProductTitle,
pg.ProductGroupTitle,
p.ProductPrice,
p.ProductImageUrl
};

}



viewstate و چیزهای دیگه ای که در ادامه کوئریت گرفتی و باید کجا بنویسم؟ اگه ممکنه یه توضیح کوچولو درباره کدت بهم بده.ممنون میشم

مهدی کرامتی
سه شنبه 02 اسفند 1390, 09:45 صبح
این جور مشکلات زمانی پیدا میشه که خروجی ایجاد شده توسط کامپوننت ها به راحتی قابل تشخیص نیست. راز رفع مشکل فوق فراخوانی تابع .ToList() قبل از تحویل نتیجه به DataSource است.

کد زیر چند تا مشکل داره:
var sublist = from m in DataContext.MyTable
where string.Compare(m.f1, txtfdate.Text)) > -1 && string.Compare(m.f1, txttodate.Text) < 1
select m;
ViewState["GridDS"] = sublist.ToList();
RadGrid1.DataSource = ViewState["GridDS"];
RadGrid1.DataBind();


1- قرار دادن نتیجه Query در ViewState کار بسیار غلطی است، چون حجم ViewState رو به شدت افزایش میده و باعث کندی عملکرد صفحه میشه.
2- این که هر بار مشخصه DataSource گرید رو از طریق Source مقدار دهی کنید باعث از کار افتادن Command های گرید و به هم خوردن یکپارچگی ViewState میشه، بنابراین بهتر است یک LinqDataSource بر روی صفحه بگذارید و در رویداد Selecting اش داده ها را تامین کنید. به این ترتیب گرید بدون مشکل هر وقت نیاز به دریافت داده ها داشته باشد از دیتاسورس داده ها را دریافت می کند و مشکلی هم پیش نمی آید:
protected void LingDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
e.Result = (from m in DataContext.MyTable
where string.Compare(m.f1, txtfdate.Text)) > -1 && string.Compare(m.f1, txttodate.Text) < 1
select m).ToList();
}

مهدی کرامتی
سه شنبه 02 اسفند 1390, 09:47 صبح
خیلی ممنونم ازت. اما میشه بگی این کوئری چی کار میکنه؟

من در رویداد selecting لینک دیتا سورسم اینو نوشتم :

protected void dsProducts_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
e.Result = from p in DataContext.context.Products
join pg in DataContext.context.ProductGroups on p.ProductGroupID equals pg.ProductGroupID
select new
{
p.ProductID,
p.ProductTitle,
pg.ProductGroupTitle,
p.ProductPrice,
p.ProductImageUrl
};

}



اگر کدت رو به این شکل تغییر بدی دیگه مشکلی وجود نخواهد داشت:

protected void dsProducts_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
e.Result = (from p in DataContext.context.Products
join pg in DataContext.context.ProductGroups on p.ProductGroupID equals pg.ProductGroupID
select new
{
p.ProductID,
p.ProductTitle,
pg.ProductGroupTitle,
p.ProductPrice,
p.ProductImageUrl
}).ToList();

}

sanay_esh
شنبه 06 اسفند 1390, 09:58 صبح
سلام و با تشکر

راز رفع مشکل فوق فراخوانی تابع .ToList() قبل از تحویل نتیجه به DataSource است.
خوب بنده از Entity Data Source استفاده میکنم و موارد را با ToList() فراخوانی و نتیجه را به RadGridDataSource میدهم ولی باز به صفحه بعدی میرم اطلاعات را در Grid نشون نمیده

این مشکل کجاست ؟

sanay_esh
یک شنبه 14 اسفند 1390, 10:37 صبح
با سلام و عرض ادب
با توجه به گفته شما :


این جور مشکلات زمانی پیدا میشه که خروجی ایجاد شده توسط کامپوننت ها به راحتی قابل تشخیص نیست. راز رفع مشکل فوق فراخوانی تابع .ToList() قبل از تحویل نتیجه به DataSource است.

کد زیر چند تا مشکل داره:
var sublist = from m in DataContext.MyTable
where string.Compare(m.f1, txtfdate.Text)) > -1 && string.Compare(m.f1, txttodate.Text) < 1
select m;
ViewState["GridDS"] = sublist.ToList();
RadGrid1.DataSource = ViewState["GridDS"];
RadGrid1.DataBind();


1- قرار دادن نتیجه Query در ViewState کار بسیار غلطی است، چون حجم ViewState رو به شدت افزایش میده و باعث کندی عملکرد صفحه میشه.
2- این که هر بار مشخصه DataSource گرید رو از طریق Source مقدار دهی کنید باعث از کار افتادن Command های گرید و به هم خوردن یکپارچگی ViewState میشه، بنابراین بهتر است یک LinqDataSource بر روی صفحه بگذارید و در رویداد Selecting اش داده ها را تامین کنید. به این ترتیب گرید بدون مشکل هر وقت نیاز به دریافت داده ها داشته باشد از دیتاسورس داده ها را دریافت می کند و مشکلی هم پیش نمی آید:
protected void LingDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
e.Result = (from m in DataContext.MyTable
where string.Compare(m.f1, txtfdate.Text)) > -1 && string.Compare(m.f1, txttodate.Text) < 1
select m).ToList();
}

بنده یک صفحه و یک RadGrid ایجاد کردم و یک LinqDataSource به صفحه اضافه و عملیات بالا رو دقیق اجرا کردم ولی با توجه به اینکه با عوض کردن صفحه RadGrid باز مشکل عدم نمایش اطلاعات وجود دارد بنده باید تنظیماتی دیگر انجام دهم ؟

در مورد Entity Data Source هم هر کاری میکنم باز مورد همان است

تنها در موردی که مشکل عدم نمایش اطلاعات با تعویض صفحه RadGrid فع میشود زمانی است که Entity Data Source رو مستقیما به دیتابیس وصل کنیم ( یعنی نمیتوان صفحه PostBack کرد و اطلاعات را در صفحه بعدی RadGrid مشاهده نمود!!!)

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

ممنون از راهنمایی های شما

bahareh1368
چهارشنبه 17 اسفند 1390, 20:15 عصر
با سلام و عرض ادب
با توجه به گفته شما :



بنده یک صفحه و یک RadGrid ایجاد کردم و یک LinqDataSource به صفحه اضافه و عملیات بالا رو دقیق اجرا کردم ولی با توجه به اینکه با عوض کردن صفحه RadGrid باز مشکل عدم نمایش اطلاعات وجود دارد بنده باید تنظیماتی دیگر انجام دهم ؟

در مورد Entity Data Source هم هر کاری میکنم باز مورد همان است

تنها در موردی که مشکل عدم نمایش اطلاعات با تعویض صفحه RadGrid فع میشود زمانی است که Entity Data Source رو مستقیما به دیتابیس وصل کنیم ( یعنی نمیتوان صفحه PostBack کرد و اطلاعات را در صفحه بعدی RadGrid مشاهده نمود!!!)

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

ممنون از راهنمایی های شما

من با entity framework هم کار کردم.مشکلی نداشت. من یه entity datasource میذارم و گرید رو مستقیم بهش وصل می کنم.اینطوری هیچ مشکلی نداره در همه موارد هم درست کار میکنه

sanay_esh
شنبه 20 اسفند 1390, 10:11 صبح
من با entity framework هم کار کردم.مشکلی نداشت. من یه entity datasource میذارم و گرید رو مستقیم بهش وصل می کنم.اینطوری هیچ مشکلی نداره در همه موارد هم درست کار میکنه

بله شما درست میفرمائید ولی اگر شما این entity framework را با کد بیارید بالا یعنی در داخل کد تعریف کنید و اگر یک جستجو هم داشته باشید به این مشکل برخواهید خورد!!!