gpt4 book ai didi

c# - 以编程方式将子控件添加到 asp.net 复合控件

转载 作者:太空宇宙 更新时间:2023-11-03 16:29:40 25 4
gpt4 key购买 nike

没有找到任何可以直接回答我的问题的东西,所以希望有人能对此有所启发。

我有两个复合控件,我们称它们为 BudgetTable 和 BudgetTableItem,其中 BudgetTable 包含 BudgetTableItem 的列表。

到目前为止,只要我在 HTML View 中添加新的 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>

背后的代码:

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

}

最佳答案

需要 ViewState 并希望接收事件的控件、自定义控件或其他控件应在 Init 中创建。

HTTP 是无状态的。每次回发时都会重新创建包含所有控件的整个页面。您在设计 View 中添加的控件会添加到您的 designer.cs 文件中,并为您创建。当您自己添加控件时,您必须编写代码以在以后发生的每个 PostBack 上重新创建控件。

您可以使用 session 来记住代码添加了哪些控件,并在以后的 PostBacks 中添加它们。

关于c# - 以编程方式将子控件添加到 asp.net 复合控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11222108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com