繁体   English   中英

Dropdownlist如何将所选值保存到ViewState?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM