PDA

View Full Version : سوال: بعد از Paging ديتاليست ، در صفحه بعدي اطلاعات صفحه قبل نمايش داده ميشه .



merlin_vista
سه شنبه 23 مهر 1387, 12:50 عصر
سلام دوستان خوبم : :قلب:

من براي صفحه بندي ديتاليست از يك SP استفاده ميكنم و لينك ها را ميسازم .

كد SP :

ALTER PROCEDURE dbo.Dsl_paging
(
@startRowIndex int,
@maximumRows int
)
AS

--DECLARE @startRow int

SET ROWCOUNT @startRowIndex

SET ROWCOUNT @maximumRows

SELECT * FROM Tbl_name

ORDER BY id

SET ROWCOUNT 0


كد هاي C# براي صفحه بندي :

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs[0].ConnectionString);
protected void Page_Load(object sender, EventArgs e)
{
this.Literal1.Text = LinkPaging();
if (!IsPostBack)
{
SelectAll();
}
}
private DataTable Bind(int start,int max)
{
SqlDataAdapter dat_sel = new SqlDataAdapter("Dsl_paging", con);
dat_sel.SelectCommand.CommandType = CommandType.StoredProcedure;
dat_sel.SelectCommand.Parameters.AddWithValue("@startRowIndex", start);
dat_sel.SelectCommand.Parameters.AddWithValue("@maximumRows", max);
DataTable dt = new DataTable();
dat_sel.Fill(dt);
return dt;

}

private int count()
{
SqlCommand cmd = new SqlCommand("all_count", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
int c = (int)cmd.ExecuteScalar();
con.Close();
return c;
}

private string LinkPaging()
{
int cu = count();
string link = "";
if (cu > 0)
{
int pg = cu / 10;
int i=1;
if( cu % 10 != 0 )
{
pg+= 1;
}
while (i <= pg)
{
link += "<a href='paging.aspx?p=" + i.ToString() + "'>" + i.ToString() + "</a>|";
i++;
}
}
return link;
}

private void SelectAll()
{
try
{
int p =int.Parse(Request.QueryString["p"].ToString());
int max = p * 10;
int start = max - 10;
this.DataList1.DataSource = Bind(start, max);
this.DataList1.DataBind();
}
catch
{
this.DataList1.DataSource = Bind(1, 10);
this.DataList1.DataBind();
}
}

از دوستان كسي ميدونه كه مشكل از كجاست . من فكر ميكنم مشكل از SP باشه ولي نميدونم از كجاش هست . :متفکر: اگر كسي ميدونه بگويد ممنون ميشم . :قلب::بوس::لبخندساده:

maryam_jamshid
سه شنبه 23 مهر 1387, 12:56 عصر
این فایلو دانلود کن و اونو اجرا کن،خیلی بهت کمک میکنه.البته اینو آقای راد به من معرفی کردن،جا داره از ایشون تشکر کنم.

merlin_vista
سه شنبه 23 مهر 1387, 16:15 عصر
maryam_jamshid @ :
ممنون دوست عزيز اين كامپونت به همراه آموزش و SP هاي اونا داشتم ولي نميخواهم از كامپونت استفاده كنم . اگه مشكل كد بالا را حل كنيد ممنون ميشم .

adonis
سه شنبه 23 مهر 1387, 17:25 عصر
ببین یه همچین مشکلی با صفحه بندی معمولا واسه وقتیه که بعد تعویض صفحه کنترلی که داده رو نشون میده دوباره بایند نشه اینجوری تغییر صفحه تو پست بک بعدی اتفاق میفته.شایدددد ازین باشه

merlin_vista
چهارشنبه 24 مهر 1387, 06:16 صبح
آقا مشكل من دقيقاً اين هست كه ، فرض كنيد در صفحه 1 ما 10 ركورد داريم كه نمايش ميدهد و صفحه بندي كاملاً انجام شده . ولي با رفتن به صفحه 2 10 ركورد جديد به همراه 10 ركورد قبلي نمايش داده ميشه . و اگر دوباره به صفحه 1 برگرديم 10 ركورد صفحه 1 نمايش داده ميشود و 10 ركورد صفحه 2 پنهان ميشود .

مشكل من فقط همين هست كه با رفتن به صفحه جديد ركورد هاي صفحه قبلي هم نمايش پيدا ميكنه .

از دوستان لطفاً كمك كنيد تا اين مشكل حل شود .

به نظر خودم سر چشمه اين مشكل SP هست ، ولي نميدونم از چه جاي كوئري ميباشد .

Chabok
چهارشنبه 24 مهر 1387, 08:32 صبح
با سلام . راستش من با SP شما حال نکردم
یکم اصولی نیست به نظرم

اگه میتونید SP رو تغییر بدین و SQL2005 هم دارین . (سرور شما هم داره) بهتره از Row_Number استفاده کنید.
توی همین سایت هم مطرح شده . توضیحاتی که قبلا در مورد این تکنیک داده شده :


با استفاده از تابع ()Row_Number در SQL 2005 میتونید هنگام Select رکوردها رو سمت دیتابیس شماره گذاری کنید و بصورت صفحه صفحه رکوردها رو بخونید . مثلا صفحه اول رکورد 1 تا 10 . صفحه دوم 11 تا 20 و ...


در SQL 2005 یک تابع به نام Row_Number() نیز وجود دارد که روی سطرها شماره گذاری می کند . در ضمن میتوانید Orderby نیز برای شماره گذاری در نظر بگیرید و سپس نتایج رو Select کنید .
برای مثال بعد از شماره گذاری میتوانید به این صورت سلکت کنید .


Select * From @MyT Where RowNum Between 1 and 10



ROW_NUMBER (Transact-SQL)
http://technet.microsoft.com/en-us/library/ms186734.aspx

موفق باشید . خدانگهدار

merlin_vista
چهارشنبه 24 مهر 1387, 08:52 صبح
ممنون دوست عزيز با RowNumber كه گفتيد نوشتم . فقط سوالي كه پيش اومده اينه كه آيا اين روش كه شما معرفي كرديد RowNumber بهتره . يا روشي كه من در پست اول گفتم .

merlin_vista
چهارشنبه 24 مهر 1387, 09:01 صبح
دوست عزيز من تو برنامه خودم ازش استفاده كردم :

ALTER PROCEDURE sp_Site_Select_Post_Search
(
@q nvarchar(MAX),
@in int,
@to int
)
AS


WITH tmp AS
(

SELECT tbl_Post.f_catId, tbl_Post.f_date, tbl_Post.f_title, tbl_Post.f_Body,tbl_Post.f_ExBody, tbl_Post.f_CountView,
tbl_Admin.f_name + ' ' + tbl_Admin.f_famil AS Fullname, tbl_category.f_name AS CatName, tbl_category.f_Description, tbl_Post.f_id
,ROW_NUMBER() OVER (ORDER BY tbl_Post.f_id) AS 'RowN'
FROM tbl_Post INNER JOIN
tbl_Admin ON tbl_Post.f_userId = tbl_Admin.f_id INNER JOIN
tbl_category ON tbl_Post.f_catId = tbl_category.f_id
WHERE (tbl_Post.f_state = 'True') And

(
tbl_Post.f_title LIKE '%'+@q+'%' OR tbl_Post.f_Body LIKE '%'+@q+'%' OR tbl_Post.f_ExBody LIKE '%'+@q+'%'
)

ORDER BY tbl_Post.f_date DESC

)

SELECT *
FROM tmp
WHERE RowN BETWEEN @in AND @to
ولي اين خطا را ميدهد (براي مشاهده تصوير بزرگ روي تصوير كليك كنيد )
http://i38.tinypic.com/30bh002.jpg (http://i38.tinypic.com/30bh002.jpg)

مشكل از ORDER BY tbl_Post.f_date DESC ، .وقتي برش ميدارم درست ميشه . ولي من ميخواهم كه باشه ..... مممنون از شما

merlin_vista
چهارشنبه 24 مهر 1387, 14:14 عصر
ممنون دوستان عزيز : قسمت آخر را اين جوري نوشتم مشكل حل شد .

SELECT *
FROM tmp
WHERE RowN BETWEEN @in AND @to
ORDER BY tmp.f_date DESC


تشكر از همه دوستاني كه من را ياري كردند.