گالری عکس با استفاده از کنترل DataListدر ASP.Net - صفحه بندی ( قسمت اول )
با سلام این اولین قسمت از مجموعه آموزشی است که در آن توضیح خواهیم داد که چگونه یک گالری عکس یا تصویر با استفاده از کنترل DataList ASP.Net ایجاد کنیم.
در این قسمت توضیح خواهم داد که چگونه پیوندهای ساده را در کنترل DataList ASP.Net مدیریت کنید. ASP.Net DataList Control قابلیت های paging داخلی ندارد بنابراین paging سفارشی را اجرا خواهیم کرد.
بانک اطلاعاتی
در اینجا، طراحی جدول پایگاه داده استفاده خواهیم کرد. از SQL Server 2005 برای این آموزش استفاده می کنیم
همانطور که متوجه شدید، نام فایل تصویر را در جدول پایگاه داده و تصاویر را در یک پوشه ذخیره میکنیم تا براساس مسیر فایل تصویری، بتوانیم تصاویر مربوط به کنترل DataList را نمایش دهیم
کنترل DataList
به صفحه بندی DataList ASP.Net دقت کنید . در زیر علامت گذاری کنترل DataList نشان داده ایم .
<asp:DataList ID="DataList1" runat="server" RepeatColumns = "2" RepeatLayout = "Table" Width = "500px">
<ItemTemplate>
<br />
<table cellpadding = "5px" cellspacing = "0" class="dlTable">
<tr>
<td>
<asp:Image ID="Image1" runat="server" ImageUrl = '<%# Eval("FilePath")%>'
Width = "200px" Height = "200px"/>
</td>
</tr>
</table>
<br />
</ItemTemplate>
</asp:DataList>
همانطور که می توانید مشاهده کنید، به راحتی فایل مسیر را به کنترل تصویر Asp.Net متصل می کنیم.
روش ذخیره شده برای صفحه بندی
برای صفحه بندی از روش ذخیره شده استفاده می کنیم
CREATE PROCEDURE [dbo].[spx_Pager]
@PageNo int = 1,
@ItemsPerPage int = 2,
@TotalRows int out
AS
BEGIN
SET NOCOUNT ON
DECLARE
@StartIdx int,
@SQL nvarchar(max),
@SQL_Conditions nvarchar(max),
@EndIdx int
IF @PageNo < 1 SET @PageNo = 1
IF @ItemsPerPage < 1 SET @ItemsPerPage = 10
SET @StartIdx = (@PageNo -1) * @ItemsPerPage + 1
SET @EndIdx = (@StartIdx + @ItemsPerPage) - 1
SET @SQL = 'SELECT FilePath
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY ID) AS Row, *
FROM tblFiles ) AS tbl WHERE Row >= '
+ CONVERT(varchar(9), @StartIdx) + ' AND
Row <= ' + CONVERT(varchar(9), @EndIdx)
EXEC sp_executesql @SQL
SET @SQL = 'SELECT @TotalRows=COUNT(*) FROM tblFiles'
EXEC sp_executesql
@query = @SQL,
@params = N'@TotalRows INT OUTPUT',
@TotalRows = @TotalRows OUTPUT
END
در زیر پارامترها و اهمیت آنها ذکر شده است :
پارامتر
|
اهمیت
|
تایپ کنید
|
PageNo
|
شماره صفحه فعلی
|
ورودی
|
ItemsPerPage
|
مجموع اعداد آیتم هایی که باید دریافت شوند
|
ورودی
|
TotalRows
|
Total Records را در جدول باز می گرداند
|
خروجی
|
این زمانی است که این سه پارامتر فرآیند ذخیره شده منتقل شده باشد . حالا ما باید منطق صفحه بندی را که در صفحه ما قرار دارد دنبال کنیم.
منطق صفحه بندی
در زیر دو متغیر نقش مهمی ایفا می کنند. CurrentPage صفحه کنونی که در کنترل DataList ASP.Net نمایش داده می شود، و ItemsPerPage که تعداد کل موارد نمایش داده شده در یک صفحه را ذخیره می کند.
C #
private int CurrentPage = 1;
private int ItemsPerPage = 2;
VB.Net
Private CurrentPage As Integer = 1
Private ItemsPerPage As Integer = 2
برای فعال کردن صفحه بندی، دو LinkButtons (قبلی و بعدی) را در یک پنل اضافه می کنیم که به عنوان Pager برای کنترل DataList ASP.Net عمل می کند.
<asp:Panel ID="pnlPager" runat="server" Height="20px" Width="153px">
<asp:LinkButton ID="lnkPrev" runat="server" CommandName = "Previous"
Text = "<< Previous" OnClick = "Pager_Click"></asp:LinkButton>
<asp:LinkButton ID="lnkNext" runat="server" CommandName = "Next"
Text = "Next >>" OnClick = "Pager_Click"></asp:LinkButton>
</asp:Panel>
همانطور که مشاهده میکنید، به راحتی Property Named CommandName را تنظیم می کنیم تا بتوانیم دکمه ها را شناسایی کرده و یک عملکرد Pager_Click فراخوانی کنیم که وقتی صفحه LinkButtons را کلیک می کنیم صفحه بندی را انجام دهد.
C #
protected void Pager_Click(object sender, EventArgs e)
{
LinkButton lnkPager = (LinkButton)sender;
int PageNo = 1;
switch (lnkPager.CommandName)
{
case "Previous":
PageNo = this.CurrentPage - 1;
break;
case "Next":
PageNo = this.CurrentPage + 1;
break;
}
int TotalRows = this.BindList(PageNo);
int PageCount = this.CalculateTotalPages(TotalRows);
ViewState["CurrentPage"] = PageNo;
if (PageNo == 1)
{
lnkPrev.Enabled = false;
}
else
{
lnkPrev.Enabled = true;
}
if (PageNo == PageCount)
{
lnkNext.Enabled = false;
}
else
{
lnkNext.Enabled = true;
}
}
VB.Net
Protected Sub Pager_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim lnkPager As LinkButton = DirectCast(sender, LinkButton)
Dim PageNo As Integer = 1
Select Case lnkPager.CommandName
Case "Previous"
PageNo = Me.CurrentPage - 1
Exit Select
Case "Next"
PageNo = Me.CurrentPage + 1
Exit Select
End Select
Dim TotalRows As Integer = Me.BindList(PageNo)
Dim PageCount As Integer = Me.CalculateTotalPages(TotalRows)
ViewState("CurrentPage") = PageNo
If PageNo = 1 Then
lnkPrev.Enabled = False
Else
lnkPrev.Enabled = True
End If
If PageNo = PageCount Then
lnkNext.Enabled = False
Else
lnkNext.Enabled = True
End If
End Sub
تابع فوق دکمه کلیک شده را مشخص می کند و به سادگی تغییرات صفحه فعلی را افزایش و یا کاهش می دهد و آن ها را در پایگاه داده به روز می کند. سپس توابع BindList و CalculateTotalPages را فراخوانی می کند تا مجموع ردیف ها و تعداد صفحات را که برای فعال یا غیرفعال LinkButtons استفاده می شود، دریافت کند.
داده های مرتبط با کنترل DataList
C #
private int BindList(int PageNo)
{
int TotalRows = 0;
DataTable dt = new DataTable();
String strConnString = System.Configuration
.ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
SqlDataAdapter sda = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand("spx_Pager");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@PageNo", SqlDbType.Int).Value = PageNo;
cmd.Parameters.Add("@ItemsPerPage", SqlDbType.Int).Value = ItemsPerPage;
cmd.Parameters.Add("@TotalRows", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.Connection = con;
try
{
con.Open();
sda.SelectCommand = cmd;
sda.Fill(dt);
DataList1.DataSource = dt;
DataList1.DataBind();
TotalRows = Convert.ToInt32(cmd.Parameters["@TotalRows"].Value);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
con.Close();
sda.Dispose();
con.Dispose();
}
return TotalRows;
}
VB.Net
Private Function BindList(ByVal PageNo As Integer) As Integer
Dim TotalRows As Integer = 0
Dim dt As New DataTable()
Dim strConnString As [String] = System.Configuration _
.ConfigurationManager.ConnectionStrings("conString").ConnectionString
Dim con As New SqlConnection(strConnString)
Dim sda As New SqlDataAdapter()
Dim cmd As New SqlCommand("spx_Pager")
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@PageNo", SqlDbType.Int).Value = PageNo
cmd.Parameters.Add("@ItemsPerPage", SqlDbType.Int).Value = ItemsPerPage
cmd.Parameters.Add("@TotalRows", SqlDbType.Int).Direction = ParameterDirection.Output
cmd.Connection = con
Try
con.Open()
sda.SelectCommand = cmd
sda.Fill(dt)
DataList1.DataSource = dt
DataList1.DataBind()
TotalRows = Convert.ToInt32(cmd.Parameters("@TotalRows").Value)
Catch ex As Exception
Response.Write(ex.Message)
Finally
con.Close()
sda.Dispose()
con.Dispose()
End Try
Return TotalRows
End Function
تابع BindList پروتکل ذخیره شده را فراخوانی می کند و داده های بازگشتی را به کنترل DataList ASP.Net متصل می کند.
محاسبه تعداد کل صفحات
تابع زیر محاسبه مجموع شمارش صفحات بر اساس مجموع ردیف ها و تعداد مواردی که برای یک صفحه نمایش داده می شوند را انجام می دهد.
C #
private int CalculateTotalPages(int intTotalRows)
{
int intPageCount = 1;
double dblPageCount = (double)(Convert.ToDecimal(intTotalRows) / Convert.ToDecimal(this.ItemsPerPage));
intPageCount = Convert.ToInt32(Math.Ceiling(dblPageCount));
return intPageCount;
}
VB.Net
Private Function CalculateTotalPages(ByVal intTotalRows As Integer) As Integer
Dim intPageCount As Integer = 1
Dim dblPageCount As Double = CDbl((Convert.ToDecimal(intTotalRows) / Convert.ToDecimal(Me.ItemsPerPage)))
intPageCount = Convert.ToInt32(Math.Ceiling(dblPageCount))
Return intPageCount
End Function
آماده سازی Pager
این تابع Pagers را برای صفحه بندی بر اساس مجموع ردیف ها و صفحه فعلی آماده می کند. اساسا آن را Pager LinkButtons را فعال یا غیرفعال می کند
C #
private void Prepare_Pager(int TotalRows)
{
int intPageCount = this.CalculateTotalPages(TotalRows);
if (intPageCount > 1 && this.CurrentPage < intPageCount)
{
this.lnkNext.Enabled = true;
}
if (this.CurrentPage != 1)
{
this.lnkPrev.Enabled = true;
}
else
{
this.lnkPrev.Enabled = false;
}
}
VB.Net
Private Sub Prepare_Pager(ByVal TotalRows As Integer)
Dim intPageCount As Integer = Me.CalculateTotalPages(TotalRows)
If intPageCount > 1 AndAlso Me.CurrentPage < intPageCount Then
Me.lnkNext.Enabled = True
End If
If Me.CurrentPage <> 1 Then
Me.lnkPrev.Enabled = True
Else
Me.lnkPrev.Enabled = False
End If
End Sub
رویداد بارگذاری صفحه
رویداد بارگذاری صفحه نقش مهمی را نیز ایفا می کند.
C #
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["CurrentPage"] != null)
{
this.CurrentPage = Convert.ToInt32(ViewState["CurrentPage"]);
}
if (!IsPostBack)
{
int TotalRows = this.BindList(1);
this.Prepare_Pager(TotalRows);
}
}
VB.Net
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
If ViewState("CurrentPage") IsNot Nothing Then
Me.CurrentPage = Convert.ToInt32(ViewState("CurrentPage"))
End If
If Not IsPostBack Then
Dim TotalRows As Integer = Me.BindList(1)
Me.Prepare_Pager(TotalRows)
End If
End Sub
در زیر کنترلهای DataList ASP.Net با صفحات سفارشی با استفاده از روش های ذخیره شده انجام می شود
این اولین بخش این آموزش است که به پایان می رسد. در بخش بعدی، توضیح خواهم داد که چگونه با افزودن ویژگی پیش نمایش و نمایش اسلاید، گالری تصویر را افزایش دهیم. کد کامل در بخش بعدی برای دانلود در دسترس خواهد بود.