C# 控件添加或加倍时不显示

C# 控件添加或加倍时不显示,c#,asp.net,C#,Asp.net,我有两个文本框用于输入物品的名称和价格,下面有一个提交按钮,下面有一个项目符号列表,显示当前物品。 单击“提交”按钮后,应将新项目输入项目列表,并使用新项目刷新项目符号列表 但是,如果我将生成项目符号列表的代码放在OnInit中,那么在第一次回发时列表不会刷新。如果我把它放在Page_Load中,那么列表只会在每次回发时重复自身。我应该把它放在哪里?我做错了什么 这是我的密码 protected override void OnInit(EventArgs e) { base.OnIni

我有两个文本框用于输入物品的名称和价格,下面有一个提交按钮,下面有一个项目符号列表,显示当前物品。 单击“提交”按钮后,应将新项目输入项目列表,并使用新项目刷新项目符号列表

但是,如果我将生成项目符号列表的代码放在OnInit中,那么在第一次回发时列表不会刷新。如果我把它放在Page_Load中,那么列表只会在每次回发时重复自身。我应该把它放在哪里?我做错了什么

这是我的密码

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    List<Product> Products = (List<Product>)Session["Products"];
    foreach (Product p in Products)
    {
        ListItem productname = new ListItem();
        productname.Text = p.name;
        blProducts.Items.Add(productname);
    }

}
protected override void OnInit(事件参数e)
{
碱基.奥尼特(e);
列表产品=(列表)会话[“产品”];
foreach(产品中的产品p)
{
ListItem productname=新建ListItem();
productname.Text=p.name;
blProducts.Items.Add(productname);
}
}
以下是“提交”按钮的代码:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    List<Product> Products = (List<Product>)Session["Products"];
    string name = txtName.Text;
    decimal price = decimal.Parse(txtPrice.Text);
    Product p = new Product(name, price);
    Products.Add(p);
    Session["Products"] = Products;
}
protectedvoid btnSubmit\u单击(对象发送方,事件参数e)
{
列表产品=(列表)会话[“产品”];
字符串名称=txtName.Text;
decimal price=decimal.Parse(txtPrice.Text);
产品p=新产品(名称、价格);
产品.加入(p);;
会话[“产品”]=产品;
}

按钮单击的回发发生在init之后,因此事件顺序为:

  • Init为产品添加1个listitem
  • 发生按钮单击,添加到产品中
  • 由于产品是在添加新项目之前枚举的,因此它不会反映在页面上

    您可以将init代码移动到prerender,因为这是处理回发后的第一个事件。它可能会加倍,因为您从未清除存储在ViewState中的项目列表,因此每次调用init(每个请求),您都会再次添加所有
    产品。您也可以在(!Page.IsPostBack)
    中包装该部分,并直接添加到列表中&单击按钮中的会话,但修复逻辑可能比复制添加代码更好。

    Page.IsPostBack==false

    使用:


    我不会使用Init。我在该函数中使用Page_load(ispostback false)。单击按钮后,再次调用刷新数据功能。您应该始终在页面加载功能上检查ispostback。确保它为false,这样就不会再次加载。

    使用过程中出现了什么问题!iPostBack是指我在同一页面上有一些用户控件,这些控件上有按钮,当我按下这些按钮时,我必须刷新页面,因为它们更改了一些内容(其中有Response.Redirect(“Default.aspx”)。然后每次我在用户控件中按下这些按钮时,IsPostBack都是false。如果返回到同一页,请不要使用Response.Redirect(),这会使回发为false。更新后再次调用load函数,它将是postback=false。除非要转到其他页面,否则不应重定向回同一页面。调用函数会将其发送回服务器,回发为true。您的意思是从用户控件调用加载函数吗?我认为你不能从用户控件的父页面调用函数?页面加载。单击添加->1。首先清除下拉列表中的项目,然后将这些项目添加到下拉列表中。我认为你必须在每次点击后清除下拉列表中的项目,否则它将继续添加。见上文。
    page_load {
    if(!Page.IsPostback)
      CalltheLoadFunction
    
    }
    
    on_click {
    _adds the stuff.
    CalltheLoadFunction() //again
    }
    
    CalltheLoadFunction() {
     dropdown.clear().
     dropdown.datasource = datasource
     dropddown.databind()
    }