下拉列表如何将所选值保存到ViewState?
我有一个下拉列表,当更改时会将新值保存到ViewState变量中,这样在回发后,如果先前设置了下拉列表,它将从ViewState中检索它的选定值。
但我无法将DropDownList1_SelectedIndexChanged中的选定值存储到ViewState,因为在DropDownList中重新加载页面(使用sql查询更新更新数据库之后)后,我没有任何选定的值。
你能帮我解决一下这个问题吗?
提前致谢。
我的代码如下。
<asp:DropDownList ID="ddl1" runat="server" AutoPostBack="true"
OnSelectedIndexChanged="ddl1_SelectedIndexChanged"
EnableViewState="true" ViewStateMode="Enabled">
<asp:ListItem Value="" Text="[Selected]"></asp:ListItem>
<asp:ListItem Value="" Text="------"></asp:ListItem>
<asp:ListItem Value="1" Text="A"> </asp:ListItem>
<asp:ListItem Value="2" Text="B"> </asp:ListItem>
<asp:ListItem Value="3" Text="C"> </asp:ListItem>
<asp:ListItem Value="4" Text="D"> </asp:ListItem>
<asp:ListItem Value="" Text="------"></asp:ListItem>
</asp:DropDownList>
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindData();
if (ViewState["List1_Value"] != null)
{
ddl1.SelectedValue = ViewState["List1_Value"].ToString();
}
}
}
protected void ddl1_SelectedIndexChanged(object sender, EventArgs e)
{
BindData();
ViewState["List1_Value"] = ddl1.SelectedValue.ToString();
}
private void SqlUpdate()
{
sql = String.Format(@" UPDATE ..... ";
using (OdbcConnection cn =
new OdbcConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString))
{
using (OdbcCommand cmd = new OdbcCommand(sql, cn))
{
cmd.Connection.Open();
cmd.ExecuteNonQuery();
Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "alert('Ok.');window.location='default.aspx';", true);
}
}
}
答案 0 :(得分:1)
您正在做的是从 Javascript 回发,在这种情况下, ViewState 会被删除,因为它就像是一个新请求一样。
在这种情况下,唯一的办法是将其存储在会话中,或者作为参数发送到页面。
最后更新数据库后只需绑定一个 GridView 即可!:
cmd.Connection.Open();
cmd.ExecuteNonQuery();
Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "alert('Ok.');", true);
BindData();
答案 1 :(得分:0)
您启用了AutoPostBack,因此每次选择更改时,它都会回发到您的Page_Load。您只是在不是回发时填写值,因此永远不会发生这种情况。
尝试移动代码以将值设置在if (!Page.IsPostBack)
块之外。也许是这样的:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindData();
}
if (ViewState["List1_Value"] != null)
{
ddl1.SelectedValue = ViewState["List1_Value"].ToString();
}
}
答案 2 :(得分:0)
从SelectedIndexChanged方法中删除BindData():
protected void ddl1_SelectedIndexChanged(object sender, EventArgs e)
{
ViewState["List1_Value"] = ddl1.SelectedValue.ToString();
}
正如其他人所提到的,您尝试在仅在NOT回发中运行的条件中设置ddl1.SelectedValue,这意味着它永远不会在回发上捕获所选值。所以你也想通过将它移到!Page.IsPostBack条件之外来解决这个问题。
答案 3 :(得分:0)
在DropDownList中重新加载页面(在使用sql查询更新更新数据库之后)时,我没有任何选定的值
据推测,你正在重新加载&#34;有两种方式之一:
<强> 1。引发后置
这不符合你的情况,因为你没有在回发中使用值:
if (!Page.IsPostBack)
{
BindData();
if (ViewState["List1_Value"] != null)
{
ddl1.SelectedValue = ViewState["List1_Value"].ToString();
}
}
如果要在后置中绑定选定的值,则需要将该代码移到该条件之外:
if (!Page.IsPostBack)
{
BindData();
}
if (ViewState["List1_Value"] != null)
{
ddl1.SelectedValue = ViewState["List1_Value"].ToString();
}
<强> 2。提出新要求
如果您手动&#34;重新加载&#34;通过简单地从浏览器的地址栏重新请求页面,该页面将是空的。 ViewState是POST请求中表单值的一部分,但从地址栏加载页面会发出没有值的GET请求。所以ViewState将为空。