Как отобразить один повторитель, скрывая другой повторитель на C # в веб-форме ASP.NET? - PullRequest
0 голосов
/ 09 января 2019

В моем веб-приложении у меня по умолчанию отображается отображение Gridview строк из таблицы базы данных, и у меня есть одно текстовое поле поиска для поиска продукта, чтобы отобразить Gridview. Что еще более важно, согласно моей логике разбиения на страницы, в Gridview будет отображаться только 10 продуктов на каждой странице.

Я создал 2 хранимые процедуры. Одна хранимая процедура даст отображение продуктов по умолчанию в Gridview, которое находится под Событием загрузки страницы. Другая хранимая процедура отобразит Продукты в Gridview, введя Имя продукта в текстовом поле. Что еще более важно, логика разбиения на страницы хранимых процедур была разработана таким образом, что в Gridview будет отображаться 10 строк на каждой странице, если Gridview имеет более 10 строк.

CREATE PROCEDURE ViewProducts           
@PageIndex INTEGER = 1,  
@PageSize INTEGER = 10,  
@RecordCount INTEGER OUTPUT    
AS  
BEGIN  
SET NOCOUNT ON;  
SELECT ROW_NUMBER() 
OVER  
(  
 ORDER BY Product_Category_Name  
)AS RowNumber,  
    Product_Image,
    Product_Name,
    Product_Category_Name,
    Product_Price,
    Product_Quantity,
    Grocery_Branch_Name   
    INTO #Results 
    FROM Product,Product_Category,Grocery_Branch
    WHERE Product_Category.Product_Category_No = Product.Product_Category_No
    AND Grocery_Branch.Grocery_Branch_No = Product.Grocery_Branch_No

    SELECT * FROM #Results  
    WHERE RowNumber BETWEEN (@PageIndex - 1) * @PageSize + 1 
    AND (((@PageIndex - 1) * @PageSize + 1) + @PageSize) - 1  

    SELECT @RecordCount = COUNT(*) FROM #Results  

    DROP TABLE #Results  
END

CREATE PROCEDURE SearchProduct
@ProductName VARCHAR(50),           
@PageIndex INTEGER = 1,  
@PageSize INTEGER = 10,  
@RecordCount INTEGER OUTPUT    
AS  
BEGIN  
SET NOCOUNT ON;  
SELECT ROW_NUMBER() OVER
(
 ORDER BY Product_Name
)
AS RowNumber,  
    Product_Image,
    Product_Name,
    Product_Category_Name,
    Product_Price,
    Product_Quantity,
    Grocery_Branch_Name   
    INTO #Results 
    FROM Product,Product_Category,Grocery_Branch
    WHERE Product_Category.Product_Category_No = Product.Product_Category_No
    AND Grocery_Branch.Grocery_Branch_No = Product.Grocery_Branch_No
    AND Product_Name LIKE '%' + @ProductName + '%'

    SELECT * FROM #Results  
    WHERE RowNumber BETWEEN (@PageIndex - 1) * @PageSize + 1 
    AND (((@PageIndex - 1) * @PageSize + 1) + @PageSize) - 1  

    SELECT @RecordCount = COUNT(*) FROM #Results  

    DROP TABLE #Results  
END

Ниже приведен код aspx, который я сделал. [Примечание: при просмотре моего кода aspx вы заметите, что я добавил 2 повторителя, где для обоих повторителей существует одно событие OnClick]

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link href="CSS/searchproducts.css" rel="stylesheet" />
</head>
<body>
<main>
<div class="content-wrap">
<h4 class="searchtext">
<strong>Search by Product Name</strong> 
</h4>

<div class="searchproducts">
<asp:Table ID="Table1" runat="server" align="center" >
<asp:TableRow ID="TableRow1" runat="server">
<asp:TableCell HorizontalAlign="Right">
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</asp:TableCell>
<asp:TableCell HorizontalAlign="Left">
<asp:Button ID="Button6" runat="server" OnClick="Search_Product" ValidationGroup="SearchByName"  Text="Search Product" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ValidationGroup="SearchByName" ErrorMessage=" Please enter a product name" Font-Bold="True"></asp:RequiredFieldValidator>
<asp:Label ID="Label1" runat="server" Font-Bold="True"></asp:Label>
</asp:TableCell>
</asp:TableRow>
</asp:Table>
</div>

<br />

<div style="margin-left:330px;">      
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" HorizontalAlign="Center" HeaderStyle-BackColor="#00a400" HeaderStyle-ForeColor="White">
<Columns>
<asp:TemplateField HeaderText="Image">
<ItemTemplate>
<asp:Image ID="Image1" runat="server" Height="100px" Width="150px"
          ImageUrl='<%#"data:Image/png/jpg/jpeg/gif/bmp;base64," + Convert.ToBase64String((byte[])Eval("Product_Image")) %>' />
</ItemTemplate>         
</asp:TemplateField>        
<asp:BoundField DataField="Product_Name" HeaderText="Product" />
<asp:BoundField DataField="Product_Category_Name" HeaderText="Category" />
<asp:BoundField DataField="Product_Price" HeaderText="Price" DataFormatString="{0:0.00} AUD" />
<asp:BoundField DataField="Product_Quantity" HeaderText="Quantity" />
<asp:BoundField DataField="Grocery_Branch_Name" HeaderText="Branch" />
</Columns>
</asp:GridView>

<br />

<table style="align-content:center; width:800px;">
<tr>
<td>    
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" Text='<%#Eval("Text") %>' CommandArgument='<%# Eval("Value") %>'
Enabled='<%# Eval("Enabled") %>' OnClick="lnkbtn_PageIndexChanged" ForeColor="#00a400"></asp:LinkButton>
</ItemTemplate>
</asp:Repeater>        
</td>
</tr>
</table>

<br />

<table style="align-content:center; width:800px;">
<tr>
<td>
<asp:Repeater ID="Repeater2" runat="server">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" Text='<%#Eval("Text") %>' CommandArgument='<%# Eval("Value") %>'
Enabled='<%# Eval("Enabled") %>' OnClick="lnkbtn_PageSearchIndexChanged" ForeColor="#00a400"></asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
</td>
</tr>
</table>

</div>
</main>

</form> 

</body>
</html> 

Чтобы сделать разбивку по страницам хранимой процедуры SQL с помощью GridView Display по умолчанию, я использовал метод DisplayProducts () для вызова хранимой процедуры ViewProducts в моем коде C #:

using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;

namespace Grocery_Demo
{
 public partial class ViewProducts : System.Web.UI.Page
{
 int PageSize = 10;

 protected void Page_Load(object sender, EventArgs e)
{
  if (!Page.IsPostBack)
  DisplayProducts(1,PageSize);
 }

SqlDataAdapter da;
DataSet ds = new DataSet();

private void DisplayProducts(int PageIndex, int PageSize)
{
string CS = ConfigurationManager.ConnectionStrings["Grocery_DemoConnectionString"].ConnectionString;

 using (SqlConnection con = new SqlConnection(CS))
{
 using (SqlCommand cmd = new SqlCommand("ViewProducts", con))
{
 cmd.CommandType = CommandType.StoredProcedure;
 cmd.Parameters.AddWithValue("@PageIndex", PageIndex);
 cmd.Parameters.AddWithValue("@PageSize", PageSize);
 cmd.Parameters.Add("@RecordCount", SqlDbType.Int, 4);
 cmd.Parameters["@RecordCount"].Direction = ParameterDirection.Output;
 da = new SqlDataAdapter(cmd);
 da.Fill(ds);
 con.Open();
 cmd.ExecuteNonQuery();

 if (ds.Tables[0].Rows.Count > 0)
    {
     GridView1.DataSource = ds.Tables[0];
     GridView1.DataBind();
    }

int recordCount = Convert.ToInt32(cmd.Parameters["@RecordCount"].Value);
                    this.PopulatePager(recordCount, PageIndex);
   }
  }

 }

protected void lnkbtn_PageIndexChanged(object sender, EventArgs e)
{
 int PageIndex = int.Parse((sender as LinkButton).CommandArgument);
 DisplayProducts(PageIndex, PageSize);
}

 private void PopulatePager(int recordCount, int currentPage)
{
 double dblPageCount = (double)((decimal)recordCount / (PageSize));
 int pageCount = (int)Math.Ceiling(dblPageCount);
 List<ListItem> pages = new List<ListItem>();
 if (pageCount > 0)
{
  pages.Add(new ListItem("FIRST >> ", "1", currentPage > 1));
  for (int i = 1; i <= pageCount; i++)
{
  pages.Add(new ListItem(i.ToString(), i.ToString(), i != currentPage));
}
  pages.Add(new ListItem(" << LAST", pageCount.ToString(), currentPage < pageCount));
}
Repeater1.DataSource = pages;
Repeater1.DataBind();
}

Затем, чтобы сделать разбивку моей хранимой процедуры SQL на текстовое поле поиска, я использовал метод DisplaySearch () для вызова хранимой процедуры SearchProduct в моем коде C #:

protected void Search_Product(object sender, EventArgs e)
{
 int PageIndex = 1;
 DisplaySearch(PageIndex, PageSize);
}

private void DisplaySearch(int PageIndex, int PageSize)
{
 string CS = ConfigurationManager.ConnectionStrings["Grocery_DemoConnectionString"].ConnectionString;

 using (SqlConnection con = new SqlConnection(CS))
{
 using (SqlCommand cmd = new SqlCommand("SearchProduct", con))
{

 cmd.CommandType = CommandType.StoredProcedure;
 cmd.Parameters.AddWithValue("@ProductName", TextBox1.Text + "%");
 cmd.Parameters.AddWithValue("@PageIndex", PageIndex);
 cmd.Parameters.AddWithValue("@PageSize", PageSize);
 cmd.Parameters.Add("@RecordCount", SqlDbType.Int, 4);
 cmd.Parameters["@RecordCount"].Direction = ParameterDirection.Output;
 da = new SqlDataAdapter(cmd);
 da.Fill(ds);
 con.Open();
 cmd.ExecuteNonQuery();

 if (ds.Tables[0].Rows.Count > 0)
   {
     GridView1.DataSource = ds.Tables[0];
     GridView1.DataBind();
     con.Close();
   }


 else
    {
     Label1.Text = " Couldn't find your product";
     GridView1.DataSource = ds;
     GridView1.DataBind();
     ds.Clear();
     con.Close();
    }

  int recordCount = Convert.ToInt32(cmd.Parameters["@RecordCount"].Value);
                    this.PopulateSearchPager(recordCount, PageIndex);
  }
 }
}

protected void lnkbtn_PageSearchIndexChanged(object sender, EventArgs e)
{
 int PageIndex = int.Parse((sender as LinkButton).CommandArgument);
 DisplaySearch(PageIndex, PageSize);
}

private void PopulateSearchPager(int recordCount, int currentPage)
{
 double dblPageCount = (double)((decimal)recordCount / (PageSize));
 int pageCount = (int)Math.Ceiling(dblPageCount);
 List<ListItem> pages = new List<ListItem>();
 if (pageCount > 0)
{
 pages.Add(new ListItem("FIRST >> ", "1", currentPage > 1));
 for (int i = 1; i <= pageCount; i++)
 {
  pages.Add(new ListItem(i.ToString(), i.ToString(), i != currentPage));
 }
 pages.Add(new ListItem(" << LAST", pageCount.ToString(), currentPage < pageCount));
 }

 Repeater2.DataSource = pages;
 Repeater2.DataBind();
}

}
}

Когда я начал запускать веб-страницу. Я почти получил желаемый результат, который хотел. Хорошо, что моя хранимая процедура логики разбиения на страницы работает правильно. GridView по умолчанию отображает 10 строк. С другой стороны, когда я ищу продукт через текстовое поле, я получаю желаемое отображение Gridview из 10 строк.

Единственная проблема, с которой я сталкиваюсь, заключается в том, что оба повторителя [Repeater1 и Repeater2] видны чуть ниже дисплея Gridview.

Примерно так:

FIRST >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 << LAST

FIRST >> 1 2 3 4 5 6 7 8 9 << LAST

Я хочу, чтобы во время события загрузки страницы для отображения GridView по умолчанию отображался только Repeater1, как показано ниже:

 FIRST >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 << LAST

И когда я ищу продукт в текстовом поле, чтобы получить отображение Gridview, должен отображаться только Repeater2, как показано ниже:

FIRST >> 1 2 3 4 5 6 7 8 9 << LAST

Что я могу понять, так это то, что мне нужно каким-то образом показать один ретранслятор, скрывая другой. Это как раз то, где я застреваю и смущаюсь.

Было бы очень полезно, если бы мои ошибки в C # -коде и ASPX-коде были определены и код решения был предоставлен соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...