簡體   English   中英

以編程方式將子控件添加到asp.net復合控件

[英]Programically adding child controls to a asp.net composite control

找不到能直接解決我問題的任何東西,因此希望有人能對此有所啟發。

我有兩個復合控件,可以將它們稱為BudgetTable和BudgetTableItem,其中BudgetTable包含BudgetTableItem的列表。

到目前為止,只要我在HTML視圖中添加新的RowItem,所有的東西都可以工作-當我以編程方式添加一個新的RowItem時,它會出現,但不能在回發后保留下來。

我只能假設我正在使用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>

后面的代碼:

    [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>");
    }

}

應該在Init創建需要ViewState並希望接收事件的控件,自定義控件或其他控件。

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

您可以使用該會話來記住代碼添加了哪些控件,並將它們添加到以后的PostBacks中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM