添加或加倍时控件不显示

时间:2012-04-08 19:45:20

标签: c# asp.net

我有两个文本框,用于输入项目的名称和价格,下面的提交按钮以及显示当前项目的项目符号列表。 单击提交按钮时,应在项目列表中输入新项目,并使用新项目刷新项目符号列表。

但是,如果我将生成项目符号列表的代码放在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 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;
}

2 个答案:

答案 0 :(得分:1)

按钮点击的回发在初始化后发生,因此您的事件顺序为:

  1. Init为产品添加1个listitem
  2. 发生按钮点击,添加到产品中。
  3. 由于在添加新项目之前枚举了产品,因此不会在页面上反映出来。

    Asp.Net Page Lifecycle Overview

    你可以将init代码移动到prerender,因为那是处理回发后的第一个事件。它可能会加倍,因为你永远不会清除那些项目列表,我相信它们存储在ViewState中,所以每次调用init(每个请求)时,你都会再次添加Products。您也可以将该部分包装在if(!Page.IsPostBack)中,并直接添加到列表中。单击按钮时的会话,但修复逻辑可能比复制添加代码更好。

答案 1 :(得分:1)

Page.IsPostBack == false。

使用:

page_load {
if(!Page.IsPostback)
  CalltheLoadFunction

}

on_click {
_adds the stuff.
CalltheLoadFunction() //again
}

CalltheLoadFunction() {
 dropdown.clear().
 dropdown.datasource = datasource
 dropddown.databind()
}

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