[英]Dropdownlist how to save selected value to ViewState?
Dropdownlist如何将所选值保存到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);
}
}
}
您正在做的是从Javascript进行回发,在这种情况下,将删除ViewState ,就好像它是一个新请求一样。
在这种情况下,唯一的事情就是将其存储在会话中或作为参数发送到页面。
最后,在更新数据库后,只需绑定GridView就很容易了!
cmd.Connection.Open();
cmd.ExecuteNonQuery();
Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "alert('Ok.');", true);
BindData();
您启用了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();
}
}
从SelectedIndexChanged方法中删除BindData():
protected void ddl1_SelectedIndexChanged(object sender, EventArgs e)
{
ViewState["List1_Value"] = ddl1.SelectedValue.ToString();
}
就像其他人提到的那样,您尝试在仅在NOT回发中运行的条件内设置ddl1.SelectedValue,这意味着它将永远不会在回发时捕获所选值。 因此,您还需要通过将其移到!Page.IsPostBack条件之外来解决该问题。
当在DropDownList中重新加载页面(使用sql查询更新更新数据库之后)时,我没有任何选定的值
大概是通过以下两种方式之一“重新加载”:
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.提出新要求
如果您只是通过从浏览器的地址栏中重新请求页面来手动 “重新加载”页面,则ViewState将为空。 ViewState是POST请求中表单值的一部分,但是从地址栏中加载页面会发出没有值的GET请求。 因此,ViewState将为空。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.