PDA

View Full Version : آیا در ObjectDataSource باید از non-generic method استفاده کرد؟



naeeme
دوشنبه 21 دی 1388, 11:35 صبح
من برای مدیریت بهینه صفحه بندی گرید، اومدم از صفحه بندی رو در سطح دیتابیس انجام دادم. و
ObjectDataSource رو به صورت زیر تعریف کردم



<asp:ObjectDataSource ID="odsMailList" runat="server"
SelectMethod="getRecivedMailCurrentUserList" TypeName="InboxMngClass" EnablePaging="True" SelectCountMethod="getCountRows">
<SelectParameters>
<asp:ControlParameter ControlID="chbxUnReadOnly" Name="UnreadOnly"
PropertyName="Checked" Type="Boolean" />
</SelectParameters>
</asp:ObjectDataSource>

اما با خطای

ObjectDataSource 'odsMailList' could not find a non-generic method 'getRecivedMailCurrentUserList' that has parameters: UnreadOnly, maximumRows, startRowIndex مواجه میشم. در حالیکه هر دو متد رو دارم.
اما یه تفاوت بین متدهای من و متدهای Sample وجود داره و این که متدهای من Generic list بر می گردونن نه DataTable. آیا به همین دلیل هست که به این خطا بر می خورم؟؟

Mostafa_Dindar
دوشنبه 21 دی 1388, 11:43 صبح
مواجه میشم. در حالیکه هر دو متد رو دارم. اما یه تفاوت بین متدهای من و متدهای Sample وجود داره و این که متدهای من Generic list بر می گردونن نه DataTable. آیا به همین دلیل هست که به این خطا بر می خورم؟؟

مشکل از اون نیست
. اسم متد Select شما getRecivedMailCurrentUserList هست که از شما انتظار داره 3 پارامتر
UnreadOnly, maximumRows, startRowIndex به اون ارسال بشه در حالی که شما تنها یک پارمتر ،UnreadOnly به اون ارسال کردید .
احتمالا موقعی که از Configure DataSource wizard پارامتر ها رو درست ست کردین ولی چون خطا داده 2 تا از اون پارامتر ها رو پاک کردین . علتش هم این بوده که متد GetRowCount که تعداد رکوردها رو برمیگردونه تنها یک پارامتر داشته .
برای رفع این مشکل باید تعداد پارامترهای هر دو متد را یکسان کنید . یعنی متد GetRowCount شما هم 3 پارمتر UnreadOnly, maximumRows, startRowIndex داشته باشه ولی از 2 پارمتر اول درون متد استفاده نکنید .

Mostafa_Dindar
دوشنبه 21 دی 1388, 11:48 صبح
به این مثال دقت کنید . متوجه میشین :
[DataObjectMethod(DataObjectMethodType.Select, false)]
public static EmployeesCollection SelectAll(int startRowIndex, int maximumRows, string sortExpression)
{
return EmployeesDB.SelectAll(startRowIndex, maximumRows, sortExpression);
}

public static int SelectAllCount(int startRowIndex, int maximumRows, string sortExpression)
{
System.Web.HttpContext context = System.Web.HttpContext.Current;
if (context.Cache["SelectAllCount"] == null)
context.Cache["SelectAllCount"] = EmployeesDB.SelectAllCount();
return (int)context.Cache["SelectAllCount"];
}


<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
DataObjectTypeName="MD.Toos.BusinessEntities.Employees" DeleteMethod="Delete"
EnablePaging="True" InsertMethod="Insert"
OldValuesParameterFormatString="original_{0}"
SelectCountMethod="SelectAllCount" SelectMethod="SelectAll"
SortParameterName="sortExpression" TypeName="MD.Toos.Bll.EmployeesManager"
UpdateMethod="Update">
<DeleteParameters>
<asp:Parameter Name="id" Type="Int32" />
</DeleteParameters>
<SelectParameters>
<asp:Parameter Name="startRowIndex" Type="Int32" />
<asp:Parameter Name="maximumRows" Type="Int32" />
<asp:Parameter Name="sortExpression" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>

naeeme
دوشنبه 21 دی 1388, 11:55 صبح
نشد!!!
من متد COunt رو با متد GetData از نظر ورودی یکی کردم اما باز همون خطا رو میده.

تفاوت بین متد من و شما قسمت sortExpression هست که فکر نمی کنم ربطی داشته باشه. این تعریف ObjectDataSource من هست. در ضمن موقع تعریف هم هیچ خطایی نگرفت!!



<asp:ObjectDataSource ID="odsMailList" runat="server"
SelectMethod="getRecivedMailCurrentUserList" TypeName="InboxMngClass" EnablePaging="True" SelectCountMethod="getCountRows">
<SelectParameters>
<asp:ControlParameter ControlID="chbxUnReadOnly" Name="UnreadOnly"
PropertyName="Checked" Type="Boolean" />
<asp:Parameter Name="startRows" Type="Int64" />
<asp:Parameter Name="countRows" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>

naeeme
دوشنبه 21 دی 1388, 11:59 صبح
مشکل به یک دلیل خیلی خنده دار بود!!!
نام گذاری من متفاوت بود!! توی این روش حتما باید از نام های startRowIndex و maximumRows استفاده بشه که نام پارامترهای من متفاوت بودن!

Mostafa_Dindar
دوشنبه 21 دی 1388, 12:02 عصر
ببينيد متن خطا ميگه كه متد شما براي Select پارامترهاي يكساني با اونچه كه در ObjectDataSource مشخص كردين نداره . شكي ندارم كه مشكل از همينه

Mostafa_Dindar
دوشنبه 21 دی 1388, 12:09 عصر
مشکل به یک دلیل خیلی خنده دار بود!!!
نام گذاری من متفاوت بود!! توی این روش حتما باید از نام های startRowIndex و maximumRows استفاده بشه که نام پارامترهای من متفاوت بودن!

مثل اينكه خودتون جواب رو پيدا كردين (همون مطلبي كه پيشتر اشاره كردم). لزومي نداره حتما از اون نامها استفاده بشه . ميتونيد از هر نامي كه ميخواين استفاده كنيد ولي به طور پيش فرض ObjectDatasource از اون نامها براي ارسال پرامتر استفاده ميكنه :

SortParameterName="mySortExpression"
MaximumRowsParameterName="myMaximumRows"
StartRowIndexParameterName="myStartRowIndex"

naeeme
دوشنبه 21 دی 1388, 12:13 عصر
اما حالا به یه مشکل جدید خوردم!! دیتا رو می کشه بیرون اما نمایش نمیده!!!!
یعنی مشکل از بایند به گرید ویو هست. چون وقتی AllowPaging مربوط یه گرید رو False می کنم، می تونم مقادیر رو در گرید ببینم اما در صورت True بودن مقادیر نشون داده نمیشه.
و همینطور، گرید می فهمه که دیتایی وجود داره چون Header Row نمایش داده میشه اما بقیه سطرها نمایش داده نمیشن.

Mostafa_Dindar
دوشنبه 21 دی 1388, 12:42 عصر
اما حالا به یه مشکل جدید خوردم!! دیتا رو می کشه بیرون اما نمایش نمیده!!!!
یعنی مشکل از بایند به گرید ویو هست. چون وقتی AllowPaging مربوط یه گرید رو False می کنم، می تونم مقادیر رو در گرید ببینم اما در صورت True بودن مقادیر نشون داده نمیشه.
و همینطور، گرید می فهمه که دیتایی وجود داره چون Header Row نمایش داده میشه اما بقیه سطرها نمایش داده نمیشن.

براي اينكه مطمئن بشيد داده رو Fetch ميكنه بهتره يك BreakPoint بزاريد و برسي كنيد. چون اگر AllowPaging رو مقدار False بدين اصلا نبايد مقداري رو نشون بده ( احتمالا يك OverLoad از همون متد بدون پارامتر stratRowIndex , maximumRow داريد )
برسي كنيد در اين حالت (وقتي كه پراتي AllowPaging در GridView مقدار False داره ) پارمترهاي متناسب در ObjectDataSource درست ست شده ؟ (يعني دوباره به حالت پيش فرض برنگشته ؟)

naeeme
دوشنبه 21 دی 1388, 13:18 عصر
من دقیقا همین کار رو کردم. فقط باید یه توضیح کوچیک می گذاشتم که خودم دستی در هنگام اجرا به rowCount مقدار دادم که دیتا fetch بشه و گرید بتونه دیتا نمایش بده.
خروجی متد 20 تا داده هست اما گرید فقط سرستون ها رو نشون میده.

Mostafa_Dindar
دوشنبه 21 دی 1388, 13:27 عصر
در حال حاضر چیزی به ذهنم نمیرسه که کجا رو اشتباه کردین . میتونید کدتون رو کامل اینجا آپلود کنید تا برسی کنم . در غیر اینصورت این مقاله رو مطالعه بفرمائید :

Custom Paging in ASP.NET 2.0 with SQL Server 2005 (http://www.4guysfromrolla.com/articles/031506-1.aspx)

Sorting Custom Paged Results (http://www.4guysfromrolla.com/articles/032206-1.aspx)

موفق باشید

naeeme
دوشنبه 21 دی 1388, 14:27 عصر
این هم یه نمونه کد ساده شده از کد من که دقیقا مشکل عدم نمایش رو داره. لیست بازگشتی دارای 50 رکورد هست اما چیزی نمایش داده نمیشه.
من دیتابیس رو در کنارش نذاشتم. به یک جدول یک فیلدی با 50 تا داده داخلش نیاز داره.

Mostafa_Dindar
دوشنبه 21 دی 1388, 14:35 عصر
متاسفانه کد شما VB هست که من کلا به کدهای VB آلرژی دارم . ضمن اینکه VB رو VS من نصب نیست . اگه وی بی کار ها به شما کمک کردن که هیچ در غیر اینصورت تا شب یک Sample كه Sorting رو هم Supprt ميكنه درست میکنم و براتون اینجا میزارم .

موفق باشید

Mostafa_Dindar
دوشنبه 21 دی 1388, 19:43 عصر
یک مقاله به آدرس زیر گذاشتم که مفصل به این موضوع پرداختم . فکر میکنم اگر اون رو مطالعه کنید دیگر مشکلی نخواهید داشت.
اگر احیانا سوالی داشتید مطرح کنید

http://barnamenevis.org/forum/showthread.php?t=199437

naeeme
سه شنبه 22 دی 1388, 08:14 صبح
یک مقاله به آدرس زیر گذاشتم که مفصل به این موضوع پرداختم . فکر میکنم اگر اون رو مطالعه کنید دیگر مشکلی نخواهید داشت.
اگر احیانا سوالی داشتید مطرح کنید

http://barnamenevis.org/forum/showthread.php?t=124242

فکر کنم یه سوال دیگه رو شما جواب دادید نه سوال من رو! این مربوط به کانکشن هست!! با عنوان "چگونه ConnectionString را داخل Web.config تعریف و استفاده کنم؟ "
=================
پ.ن: فکر کنم منظور شما این لینک (http://barnamenevis.org/forum/showthread.php?t=199437) بوده! مرسی

Mostafa_Dindar
سه شنبه 22 دی 1388, 11:31 صبح
فکر کنم یه سوال دیگه رو شما جواب دادید نه سوال من رو! این مربوط به کانکشن هست!! با عنوان "چگونه ConnectionString را داخل Web.config تعریف و استفاده کنم؟ "
=================
پ.ن: فکر کنم منظور شما این لینک (http://barnamenevis.org/forum/showthread.php?t=199437) بوده! مرسی

حق با شما بود . لينك رو اصلاح كردم