2013-03-12 35 views
0

我有一個.aspx應用程序,其中用戶輸入名稱並將該名稱添加到列表中。這可以完成五次。當用戶點擊按鈕時,輸入的名字將顯示在第一個標籤中。當用戶輸入另一個名稱並單擊按鈕時,第一個標籤保持不變,下一個標籤顯示新名稱等等。我的問題是列表在PostBack上重置。我正在嘗試使用ViewState來幫助解決這個問題,但沒有成功。任何幫助是極大的讚賞。列表保留在回傳後填充

編輯:我知道它的工作,所以謝謝大家的幫助。仍有很大的改進空間,但這是一個很好的起點。

 [Serializable] 
    class Recipient 
    { 
     public string Fname { get; set; } 
     public string MInit { get; set; } 
     public string Lname { get; set; } 
     public string Suffix { get; set; } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void btnEnter_Click(object sender, EventArgs e) 
    { 
     Recipient recipients = new Recipient(); 

     List<string> FName = (List<string>)ViewState["recipientList"]; 
     List<string> MInit = (List<string>)ViewState["recipientList"]; 
     List<string> LName = (List<string>)ViewState["recipientList"]; 


     if (FName == null && MInit == null && LName == null) 
     { 
      FName = new List<string>(); 
      MInit = new List<string>(); 
      LName = new List<string>(); 
     } 

     recipients.Fname = txtFName.Text; 
     recipients.MInit = txtMinit.Text; 
     recipients.Lname = txtLName.Text; 
     FName.Add(recipients.Fname); 
     MInit.Add(recipients.MInit); 
     LName.Add(recipients.Lname); 
     ViewState["recipientList"] = FName; 
     ViewState["recipientList"] = MInit; 
     ViewState["recipientList"] = LName; 

     if (FName.Count == 1 && MInit.Count == 1 && LName.Count == 1) 
     { 
      lblFName.Text = FName[0] + " " + MInit[0] + " " + LName[0]; 
     } 

     if (FName.Count == 4 && MInit.Count == 4 && LName.Count == 4) 
     { 
      lblFName1.Text = FName[1] + " " + MInit[2] + " " + LName[3]; 
     } 

    } 

回答

0

我不知道收件人類的目的。無論如何,你想在添加收件人之前實例化收件人列表。

enter image description here

<asp:TextBox runat="server" ID="txtFName" /><br /> 
<asp:Button runat="server" ID="btnEnter" Text="Submit" OnClick="btnEnter_Click" /><br /> 
<asp:Label runat="server" ID="lblFName" /><br /> 
<asp:Label runat="server" ID="lblFName1" /><br /> 
<asp:Label runat="server" ID="lblFName2" /><br /> 
<asp:Label runat="server" ID="lblFName3" /><br /> 
<asp:Label runat="server" ID="lblFName4" /><br /> 

[Serializable] 
public class Recipient 
{ 
    public string name { get; set; } 
} 

public List<Recipient> recipientList 
{ 
    get 
    { 
     if (ViewState["recipientList"] != null) 
      return (List<Recipient>)ViewState["recipientList"]; 
     return new List<Recipient>(); 
    } 
    set { ViewState["recipientList"] = value; } 
} 

protected void btnEnter_Click(object sender, EventArgs e) 
{ 
    List<Recipient> recipient = recipientList; 
    recipient.Add(new Recipient{ name = txtFName.Text.Trim()}); 
    recipientList = recipient; 

    int count = recipient.Count; 

    if (count == 1) 
     lblFName.Text = recipientList[0].name; 

    if (count > 1) 
     lblFName1.Text = recipientList[1].name; 

    if (count > 2) 
     lblFName2.Text = recipientList[2].name; 

    if (count > 3) 
     lblFName3.Text = recipientList[3].name; 

    if (count > 4) 
     lblFName4.Text = recipientList[4].name; 
} 
+0

我得到它的工作(見上文),但我喜歡你如何做到這一點。此版本可以幫助錯誤處理以及用戶編輯信息。非常感謝,我會盡力整合你所做的。 – Chris 2013-03-12 21:28:00

+0

只是注意到你在威奇托。我自己住在安多弗,所以感謝鄰居! – Chris 2013-03-12 21:33:53

+0

這是一個小世界。 ;)如果您有任何問題,只需填寫我的名字。保重! – Win 2013-03-12 21:38:50

0

你真的需要一個清單嗎?你可以做...

if(lblFName.Text.Equals(String.Empty)) 
{ 
    lblFName.Text = value; 
} 
else if(lblFName1.Text.Equals(String.Empty)) 
{ 
    lblFName1.Text = value; 
}//and so on... 
+0

我嘗試了一些類似的東西,在開始時沒有運氣。從我看到這樣做後,列表可能是最好的選擇。該項目將擴展爲使用多個文本框以及下拉列表。在繼續執行大部分項目之前,我只想讓這部分工作。我也知道ViewState會佔用大量的資源,但它最符合用戶的需求。 – Chris 2013-03-12 18:57:09

+0

recipientList =收件人; 可能是問題,它不應該是recipientList.AddRange(收件人) – 2013-03-12 18:59:05

+0

它可以工作,但是在回發時,它不保留列表中的名稱,因此無論新名稱多少次都填充第一個標籤添加。 – Chris 2013-03-12 19:08:31

0

如果當你點擊確認按鈕回發的射擊。然後,您需要處理重建Page_Load中的列表。這樣的事情:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     recipientList = (List<string>)ViewState["recipientList"]; 

     //now load the list 
    } 
    }