下拉列表如何将所选值保存到ViewState?

时间:2016-03-22 16:07:48

标签: c# viewstate

下拉列表如何将所选值保存到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);
        }
    }
}

4 个答案:

答案 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将为空。