为什么我的变量会失去它的价值?

时间:2015-10-17 02:57:08

标签: c# asp.net

selectedindexchanged事件中,我的变量有一个值,但当它到达btn_click()事件时,变量不再具有值。那是为什么?

public partial class TestingDatapass
{
  private string item = null;
  private string itemprice = null;
  private int totalprice = 0;

  protected void item_selectedindexchanged(object sender, EventArgs e)
  {
      //Both have a value here
      item = item.SelectedValue;
      itemprice = item.SelectedValue.Text;
  }

  protected void btn_click(object sender, EventArgs e)
  {
      //no value here
      totalprice = Convert.ToInt32(itemprice)*Convert.ToInt32(item);
      MessageBox.Show(totalprice);
  }
}

修改
并回答?在评论中提出,出现的顺序是selectedindexchange那么btn_click()

关于查看状态的编辑
那么这将是建立我想要实现的目标的正确方法吗?

public partial class TestingDatapass
{
    private int totalprice = 0;

  protected void item_selectedindexchanged(object sender, EventArgs e)
  {
      ViewState["item"] = item.SelectedValue;
      ViewState["itemprice"] = item.SelectedValue.Text;
  }

  protected void btn_click(object sender, EventArgs e)
  {
      totalprice = Convert.ToInt32(ViewState["item"])*Convert.ToInt32(ViewState["itemprice"]);
  }
}

1 个答案:

答案 0 :(得分:1)

当请求页面时,ASP.NET会创建 protected void showDialog(final DialogFragment diag) { cancelDialog(); if (diag != null && !diag.isAdded()) diag.show(getSupportFragmentManager().beginTransaction(), "dialog"); } 类的实例并初始化TestingDatapassitemprice等字段。现在,当您更改客户端的下拉列表(我假设查看您的totalprice方法)时,会发生回发并分配您在item_selectedindexchanged中提到的值。最后,它会销毁实例,生成html并将其发送回浏览器。

现在,当您按下页面中的按钮时,会创建一个新实例,您的字段会重新初始化,并且您无法在item_selectedindexchanged中看到更改后的值。这是它的工作原理。

因此,如果您想要在回发中保留任何数据,请考虑使用btn_click之类的任何State Management技术。

另外,作为旁注,ASP.NET中没有ViewState, HiddenField

<强>更新

我回答了为什么它没有保留按钮点击事件中的值,有很多方法可以做到这一点。但是要回答你的问题,我没有看到任何理由将值存储在MessageBox.Show事件中,因为你没有在那里做任何事情。您可以直接访问按钮单击处理程序中的下拉列表选定值,如下所示: -

item_selectedindexchanged

另外,请注意protected void btn_click(object sender, EventArgs e) { totalprice = Convert.ToInt32(item.SelectedValue) * Convert.ToInt32(item.SelectedItem.Text); } 而非item.SelectedItem.Text