2014-12-07 6 views
0

Эй, я задаю еще один вопрос с моим полным кодом, потому что я действительно застрял в этом вопросе. При загрузке страницы панель заполняется категориями книг, взятыми из базы данных. Эти категории также являются linkbuttons. Когда я нажимаю одну категорию, таблица создается ниже со всеми книгами по этой категории. В этой таблице первая ячейка заполнена названием книги, которая также является Linkbutton. Я просто хочу, когда я нажму на эту ссылку на название книги, чтобы запустить функции book_Details , чтобы страница теперь показывала только ту книгу, которую я выбрал.От Page_Load до One_Method и от One_Method до Another_Method

Вместо того, чтобы каждый раз, когда я нажимаю загрузки страницы books'title LinkButton снова с 0.

Разметка:

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server"> 
<div style="position: relative; top: 5%; left: 5%;"> 
    <asp:Panel ID="MyPanel" runat="server"></asp:Panel> 
</div> 
<asp:MultiView ID="MultiView2" runat="server"> 
    <asp:View ID="View1" runat="server"> 
     <div style="overflow: auto; height: 400px;"> 
      <asp:Table ID="ProductTBL" runat="server" BorderColor="Black" BorderStyle="Double" CellPadding="5" CellSpacing="5" BorderWidth="1px"> 
      </asp:Table> 
     </div> 
    </asp:View> 
    <asp:View ID="View2" runat="server"> 
     <asp:Table ID="detail_TBL" runat="server" BorderColor="Black" BorderStyle="Double" CellPadding="5" CellSpacing="5" BorderWidth="1px"></asp:Table> 
    </asp:View> 
</asp:MultiView> 
</asp:Content> 

А код-за это:

protected void Page_Load(object sender, EventArgs e) 
{ 
    String conString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source =" + 
       Server.MapPath("~/e-bookstoredb.accdb"); 
    using (OleDbConnection connection = new OleDbConnection(conString)) 
    { 
     connection.Open(); 

     ыtring query = "SELECT * FROM category"; 
     using (OleDbCommand cmd = new OleDbCommand(query, connection)) 
     { 
      OleDbDataReader reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
       string literal = (string)reader["Name"]; 

       LinkButton lnk_button = new LinkButton(); 
       lnk_button.Text = literal; 
       lnk_button.ID = "cat_B" + reader["ID"].ToString(); 
       lnk_button.CommandArgument = reader["ID"].ToString(); 
       lnk_button.CommandName = reader["ID"].ToString(); 
       lnk_button.Command += new CommandEventHandler(books_Show); 

       MyPanel.Controls.Add(lnk_button); 
       MyPanel.Controls.Add(new LiteralControl("</br>")); 
      } 
      reader.Close(); 
     } 
     connection.Close(); 
    } 
} 

protected void books_Show(object sender, EventArgs e) 
{ 
    LinkButton lnk = sender as LinkButton; 
    string cat = lnk.CommandArgument; 
    MultiView2.ActiveViewIndex = 0; 

    string ConStr = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source =" + Server.MapPath("~/e-bookstoredb.accdb"); 
    using (OleDbConnection con = new OleDbConnection(ConStr)) 
    { 
     con.Open(); 
     string query = "SELECT * FROM product WHERE category = @cat"; 
     using (OleDbCommand cmd = new OleDbCommand(query, con)) 
     { 
      cmd.Parameters.AddWithValue("@cat", cat); 
      OleDbDataReader reader = cmd.ExecuteReader(); 
      TableCell cell; 

      TableRow row = new TableRow(); 
      TableCell titleCell = new TableCell(); 
      titleCell.Text = "Τίτλος"; 

      TableCell desCell = new TableCell(); 
      desCell.Text = "Περιγραφή"; 
      TableCell priceCell = new TableCell(); 
      priceCell.Text = "Τιμή"; 

      row.Cells.Add(titleCell); 
      row.Cells.Add(desCell); 
      row.Cells.Add(priceCell); 

      ProductTBL.Rows.Add(row); 
      LinkButton book_button; 

      while (reader.Read()) 
      { 
       book_button = new LinkButton(); 
       book_button.ID = "book" + reader["ID"].ToString(); 
       book_button.Text = (string)reader["Title"]; 
       book_button.CommandArgument = (string) reader["Title"]; 
       book_button.CommandName = "cmd" + reader["ID"].ToString(); 
       book_button.Command += new CommandEventHandler(book_Details); 

       row = new TableRow(); 

       cell = new TableCell(); 
       cell.Controls.Add(book_button); 
       row.Cells.Add(cell); 

       cell = new TableCell(); 
       cell.Text = (string)reader["Description"]; 
       row.Cells.Add(cell); 

       cell = new TableCell(); 
       cell.Text = reader["price"].ToString()+"€"; 
       row.Cells.Add(cell); 

       ProductTBL.Rows.Add(row); 
      } 
      reader.Close(); 
     } 
     con.Close(); 
    } 
} 

protected void book_Details(object sender, EventArgs e) 
{ 
    MultiView2.ActiveViewIndex = 1; 
    LinkButton lnk = sender as LinkButton; 
    String bookTitle = lnk.CommandArgument; 
    //...And then I just create a table to show only the book user selected 
    //...this table gets filled buy this query = " SELECT * FROM product WHERE [email protected] 
} 

ответ

1

Вы должен обернуть ваш код в пределах Page_Load с помощью if(!IsPostBack), как показано ниже. Это связано с тем, что в соответствии с жизненным циклом страницы ASP.Net Page_Load запускает сначала и управляет событиями после этого.

Таким образом, всякий раз, когда вы нажимаете свой LinkButtons, сервер сначала вызывает Page_Load, а затем вызывает событие нажатия кнопки LinkButton.

Итак, это хорошая идея, чтобы обернуть ваш код Page_Load, где вы только хотите выполнить один раз во время Page_Load вот так.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     // Your Page_Load logic goes here 
    } 
} 

В соответствии с MSDN определение для IsPostBack является

Получает значение, указывающее, является ли страница, оказываемые за первый раз или загружается в ответ на обратную передачу.

true если страница загружается в ответ на обратную передачу клиента; в противном случае, false.

Надеюсь, это помогло!

+0

Спасибо большое! Но когда второй метод (book_details) уволен, я хочу передать правильный аргумент, чтобы показать нужную книгу. Как принять этот аргумент в методе page_load. Как и в методе books_show? – Kostis

+0

Зачем вам это нужно в событии Page_Load? Дайте мне подробное объяснение того, что вам нужно сейчас – Sam

+0

Я мог бы сказать, например, в page_load if (Session ["method"] == "showbookdetails") { book_detail (отправитель, e); } но как я могу принять аргумент со мной? – Kostis