2010-11-04 56 views
0

我完全是asp.net中的新特性,我遇到了一些問題。 我爲演示和學習創建了litle web表單,我遇到了一些問題。 Hopefuly你能幫助我:)Asp.net中事件的問題

我想要的是:

  • 當我點擊表格中的「殺X」按鈕,我得到了標籤「lblMsg」「你按下按鈕,殺死X」消息。我也希望我有新的數據表。
  • 當我點擊「加載」按鈕,我需要在表中獲得額外的行。例如,現在當頁面加載時,表中有10行,當我單擊「加載」時,我需要將最後10行添加到同一個表中。

P.S.: 我將不勝感激一些教程如何處理在asp.net中的事件。

貝婁是代碼:

WebForm1.aspx的

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="HelpdeskOsControl.WebForm1" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
<asp:Panel ID="Panel1" runat="server" Height="465px" Width="417px"> 
    <asp:Table ID="Processes" runat="server" Height="20px" Width="400px" CssClass="tablesorter"> 
     <asp:TableHeaderRow ID="ProcessesHeader" runat="server" 
     TableSection="TableHeader"> 
      <asp:TableHeaderCell ID="TableHeaderCell1" runat="server">Name</asp:TableHeaderCell> 
      <asp:TableHeaderCell ID="TableHeaderCell2" runat="server">CPU</asp:TableHeaderCell> 
      <asp:TableHeaderCell ID="TableHeaderCell3" runat="server">Memory</asp:TableHeaderCell> 
      <asp:TableHeaderCell ID="TableHeaderCell4" runat="server"></asp:TableHeaderCell> 
     </asp:TableHeaderRow> 
    </asp:Table> 
    <asp:Panel ID="Panel2" runat="server"> 
     <asp:Button ID="btnLoad" runat="server" onclick="btnLoad_Click" Text="Load" /> 
     <asp:Button ID="btnClear" runat="server" onclick="btnClear_Click" 
      Text="Clear" /> 
     <asp:Label ID="lblMsg" runat="server" Text="Label"></asp:Label> 
    </asp:Panel> 
</asp:Panel> 
    </form> 
</body> 
</html> 

WebForm1.aspx.cs中爲您

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace HelpdeskOsControl 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
       GenerateTable(getTestData()); 
     } 

     private List<string> getTestData() 
     { 
      List<string> tData = new List<string>(); 
      Random rand = new Random(); 
      for (int i = 0; i < 10; i++) 
      { 
       tData.Add("proc" + i + "_" + rand.Next(100) + "_" + rand.Next(100)); 
      } 

      return tData; 
     } 

     protected void btnClear_Click(object sender, EventArgs e) 
     { 
      for (int i = Processes.Rows.Count; i > 1; i--) 
      { 
       Processes.Rows.RemoveAt(i - 1); 
      } 
     } 

     protected void btnLoad_Click(object sender, EventArgs e) 
     { 
      GenerateTable(getTestData()); 
     } 

     protected void btnKill_Click(object sender, EventArgs e) 
     { 
      lblMsg.Text = "You pressed button " + ((Button)sender).Text; 
     } 

     private void GenerateTable(List<string> list) 
     { 
      int st = 0; 
      foreach (string line in list) 
      { 
       TableRow tr = new TableRow(); 
       Processes.Controls.Add(tr); 

       foreach (String str in line.Split('_')) 
       { 
        int index = tr.Cells.Add(new TableCell()); 
        tr.Cells[index].Text = str; 
       } 

       Button b = new Button(); 
       b.Text = "Kill " + st; 
       b.ID = "btnKill_" + st; 
       b.Click += new EventHandler(btnKill_Click); 
       TableCell tc = new TableCell(); 
       tc.Controls.Add(b); 
       tr.Cells.Add(tc); 

       tr.TableSection = TableRowSection.TableBody; 
       st++; 
      } 
      Processes.BorderStyle = BorderStyle.Solid; 
      Processes.GridLines = GridLines.Both; 
      Processes.BorderWidth = 2; 
     } 

    } 
}- 

回答

2

我知道這是您第一次使用ASP.NET,並希望幫助您瞭解更多關於它的潛力。首先,我將用數據綁定替換您編寫的代碼,這是一種輕鬆構建表而無需編寫像generateTable這樣的方法的方法。 ASP.NET負責自行構建表格。這將需要我花一段時間來說明完成代碼的完整代碼,但我希望你能抓住documentation,並在我的幫助下開始學習。

關鍵控件是GridView。它可以使用兩行代碼片段填充

protected override OnLoad(EventArgs e) 
{ 
    if (!IsPostback) DataBind(); 
} 

protected override void OnDataBind(EventArgs e) 
{ 
    gridView.DataSource = getTestData(); 
    gridView.DataBind(); 
} 

您必須首先在佈局中配置列。關於GridView的文章處理這個問題,您可以爲每一行添加一個按鈕。

現在,

可以設置按鈕爲命令按鈕,這樣不僅提高了點擊事件,但是,更重要的是,命令事件這需要一個名字和一個參數。這就是您可以注入代碼的地方。例如

<asp:Button id="btnSomething" CommandArgument="[procId]" CommandName="kill" OnCommand="myCommandHandler" /> 

protected void myCommandHandler(object sender, CommandEventArgs e) 
{ 
    if (e.CommandName=="kill") 
    { 
     killProcess(e.CommandArgument); 

     DataBind(); //MOST IMPORTANT 
    } 
} 

希望能有所幫助。我手工編寫了這段代碼,所以請理解我是否不能立即工作

+0

謝謝你的例子和建議。但我仍然想知道如何對我當前的代碼進行覈實,這些代碼將按照需要工作。 – Primoz 2010-11-04 13:04:18

2

您需要存儲頁面加載之間的表的狀態並重新生成它,因爲動態控件不存儲在請求之間。 (使用ListView,DataGrid等的優點)。

public partial class WebForm1 : System.Web.UI.Page 
{ 
    private List<string> CurrentTestData 
    { 
     get 
     { 
      if (ViewState["CurrentTestData"] == null) 
       return new List<string>(); 
      else 
       return (List<string>)ViewState["CurrentTestData"]; 
     } 
     set 
     { 
      ViewState["CurrentTestData"] = value; 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      CurrentTestData = getTestData(); 
      GenerateTable(CurrentTestData); 
     } 
     else 
      GenerateTable(CurrentTestData); 
    } 

    private List<string> getTestData() 
    { 
     List<string> tData = new List<string>(); 
     Random rand = new Random(); 
     for (int i = 0; i < 10; i++) 
     { 
      tData.Add("proc" + (CurrentTestData.Count + i) + "_" + rand.Next(100) + "_" + rand.Next(100)); 
     } 

     return tData; 
    } 

    protected void btnClear_Click(object sender, EventArgs e) 
    { 
     ClearTheTable(); 
     CurrentTestData = null; 
    } 

    protected void btnLoad_Click(object sender, EventArgs e) 
    { 
     var CombinedTestData = CurrentTestData; 
     CombinedTestData.AddRange(getTestData()); 
     CurrentTestData = CombinedTestData; 
     GenerateTable(CurrentTestData); 
    } 

    protected void btnKill_Click(object sender, EventArgs e) 
    { 
     lblMsg.Text = "You pressed button " + ((Button)sender).Text; 
    } 

    private void GenerateTable(List<string> list) 
    { 
     ClearTheTable(); 

     int st = 0; 
     foreach (string line in list) 
     { 
      TableRow tr = new TableRow(); 
      Processes.Controls.Add(tr); 

      foreach (String str in line.Split('_')) 
      { 
       int index = tr.Cells.Add(new TableCell()); 
       tr.Cells[index].Text = str; 
      } 

      Button b = new Button(); 
      b.Text = "Kill " + st; 
      b.ID = "btnKill_" + st; 
      b.Click += new EventHandler(btnKill_Click); 
      TableCell tc = new TableCell(); 
      tc.Controls.Add(b); 
      tr.Cells.Add(tc); 

      tr.TableSection = TableRowSection.TableBody; 
      st++; 
     } 
     Processes.BorderStyle = BorderStyle.Solid; 
     Processes.GridLines = GridLines.Both; 
     Processes.BorderWidth = 2; 
    } 

    private void ClearTheTable() 
    { 
     for (int i = Processes.Rows.Count; i > 1; i--) 
     { 
      Processes.Rows.RemoveAt(i - 1); 
     } 
    } 
}