2012-06-27 49 views
2

沒有發現任何直接回答我的問題的東西,所以希望有人可以對此有所瞭解。以編程方式將子控件添加到一個asp.net複合控件

我有兩個複合控件,讓我們稱它們爲BudgetTable和BudgetTableItem,其中BudgetTable包含BudgetTableItem列表。

到目前爲止,只要我在HTML視圖中添加新的RowItems,只要我以編程方式添加一個,它就會出現,但不會在回發中生存。

我只能假設我正在用ViewState做一些事情,並會很感激任何指針!

在此先感謝。

的HTML:

<hea:BudgetTable runat="server" ID="btTest" MaximumFundingAvailable="7000" CssClass="bob"> 
      <Items> 
        <hea:BudgetTableItem runat="server" Description="Test1" /> 
        <hea:BudgetTableItem runat="server" Description="Test2" /> 
        <hea:BudgetTableItem runat="server" Description="Test3" /> 
      </Items>   
    </hea:BudgetTable> 

的背後代碼:需要一個ViewState並希望接收事件

[PersistenceMode(PersistenceMode.InnerProperty)] 
[ParseChildren(true)] 
public class BudgetTableItem : CompositeControl { 

    private TextBox _description = new TextBox(); 

    private TextBox _cost = new TextBox(); 

    private CheckBox _heaFunded = new CheckBox(); 

    /*public delegate void AddRow(); 
    public delegate void RemoveRow(BudgetTableItem item); 

    public event AddRow AddNewRow; 
    public event RemoveRow RemoveNewRow;*/ 

    public string ItemName { 
     get { 
      var viewstate = ViewState["ItemName"]; 
      return (viewstate is string) ? (string)viewstate : "default"; 
     } 
     set { 
      ViewState["ItemName"] = value; 
     } 
    } 

    public bool ShowRemoveRow { 
     get { 
      var viewstate = ViewState["ShowRemoveRow"]; 
      return (viewstate != null && viewstate is bool) ? (bool)viewstate : false; 
     } 
     set { 
      ViewState["ShowRemoveRow"] = value; 
     } 
    } 

    public bool ShowAddRow { 
     get { 
      var viewstate = ViewState["ShowAddRow"]; 
      return (viewstate != null && viewstate is bool) ? (bool)viewstate : false; 
     } 
     set { 
      ViewState["ShowAddRow"] = value; 
     } 
    } 

    public string Description { 
     get { 
      return _description.Text; 
     } 
     set { 
      _description.Text = value; 
     } 
    } 

    public decimal Cost { 
     get { 
      decimal cost =0; 
      decimal.TryParse(_cost.Text, out cost); 
      return cost; 
     } 
     set { 
      _cost.Text = value.ToString(); 
     } 
    } 

    public bool HeaFunded { 
     get { 
      return _heaFunded.Checked; 
     } 
     set { 
      _heaFunded.Checked = value; 
     } 
    } 

    protected override void CreateChildControls() { 

     Controls.Clear(); 

     HtmlTableCell tableCell1 = new HtmlTableCell(); 
     HtmlTableCell tableCell2 = new HtmlTableCell(); 
     HtmlTableCell tableCell3 = new HtmlTableCell(); 
     HtmlTableCell tableCell4 = new HtmlTableCell(); 

     tableCell1.Attributes.Add("class", "col1"); 
     tableCell2.Attributes.Add("class", "col2"); 
     tableCell3.Attributes.Add("class", "col3"); 
     tableCell4.Attributes.Add("class", "col4"); 

     tableCell1.Controls.Add(_description); 
     tableCell2.Controls.Add(_cost); 
     tableCell3.Controls.Add(_heaFunded); 

     /*if (ShowAddRow || ShowRemoveRow) { 

      Button addNewButton = new Button(); 

      addNewButton.Text = (ShowAddRow) ? "Add Row" : "Remove"; 

      if (ShowAddRow) {     
       addNewButton.Click += new EventHandler(addNewButton_Click); 
      } 

      if (ShowRemoveRow) { 
       addNewButton.Click += new EventHandler(removeButton_Click); 
      } 

      tableCell4.Controls.Add(addNewButton); 
     } 
     else{*/ 
      tableCell4.InnerHtml = "&nbsp;"; 
     //} 

     Controls.Add(tableCell1); 
     Controls.Add(tableCell2); 
     Controls.Add(tableCell3); 
     Controls.Add(tableCell4); 
    } 

    /*void addNewButton_Click(object sender, EventArgs e) { 
     if (AddNewRow != null) { 
      AddNewRow(); 
     } 
    }*/ 

    /*void removeButton_Click(object sender, EventArgs e) { 
     if (RemoveNewRow != null) { 
      RemoveNewRow(this); 
     } 
    }*/ 

    protected override void RecreateChildControls() { 
     EnsureChildControls(); 
    } 

    public override void RenderBeginTag(HtmlTextWriter writer) { 
     writer.Write("<tr>"); 
    } 

    public override void RenderEndTag(HtmlTextWriter writer) { 
     writer.Write("</tr>"); 
    } 

} 
+0

請確保您始終在每次回發中添加相同的子女,並且最好作爲「Init」階段的一部分 – freefaller

+0

與freefaller達成一致。問題出現在您的頁面的代碼隱藏處,您正在實例化控件,而不是控件本身的代碼。作爲一個無狀態的環境,控件不存在於回發之間,而不是明確創建(這是aspx的一部分)。如果您從頁面的代碼隱藏添加控件,則需要爲每個回發重新創建它。 –

+0

如果我正確地理解了這個問題,我想你需要專注於弄清楚BudgetTable控件的作用。 IT應確保所有子控件在發回後都會持續並恢復。 – user1429080

回答

0

控制,自定義或以其他方式應Init創建。

Http是無狀態的。您的整個頁面及其所有控件都會在每次回發時重新創建。您在設計視圖中添加的控件將添加到您的designer.cs文件中,併爲您創建。當您自己添加控件時,必須編寫代碼來重新創建稍後發生的每個PostBack上的控件。

您可以使用會話來記住哪些控件是由代碼添加的,並將它們添加到稍後的PostBack上。

相關問題