为什么我的变量失去了它的值

本文关键字:失去 我的 变量 为什么 | 更新日期: 2023-09-27 18:18:01

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()

EDIT about View State
那么这是一种合适的方式来实现我想要实现的目标吗?

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

为什么我的变量失去了它的值

当一个页面被请求时,ASP. NET创建TestingDatapass类的实例并初始化itemprice, totalprice等字段。现在,当您从客户端更改下拉菜单时(我假设查看您的item_selectedindexchanged方法),Postback发生并分配您在item_selectedindexchanged中提到的值。最后,它销毁实例,生成html并将其发送回浏览器。

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

因此,如果您希望在回发期间保留任何数据,请考虑使用任何状态管理技术,如ViewState, HiddenField等。

另外,作为旁注,MessageBox.Show在ASP.NET中不可用。

更新:

我回答了为什么它不保留按钮点击事件的值,有很多方法可以做到这一点。但是要回答你的问题,我看不出有任何理由在item_selectedindexchanged事件中存储值,因为你没有在那里做任何事情。你可以像这样直接访问按钮点击处理程序中的下拉选择值:-

protected void btn_click(object sender, EventArgs e)
  {
      totalprice = Convert.ToInt32(item.SelectedValue) * 
                   Convert.ToInt32(item.SelectedItem.Text);
  }

还有,请注意是item.SelectedItem.Text而不是SelectedValue.Text