C# Dropdownlist如何将选定值保存到ViewState?

C# Dropdownlist如何将选定值保存到ViewState?,c#,viewstate,C#,Viewstate,Dropdownlist如何将选定值保存到ViewState 我有一个dropdownlist,当更改时,它会将新值保存到ViewState变量中,这样在回发之后,dropdownlist将从ViewState中检索它所选的值(如果以前设置过) 但我无法将所选值存储在DropDownList 1中,因为在DropDownList中重新加载页面(使用sql查询更新数据库后)时,我没有任何所选值 你能帮我解决这个问题吗 提前谢谢 下面是我的代码 <asp:DropDownList ID="dd

Dropdownlist如何将选定值保存到ViewState

我有一个dropdownlist,当更改时,它会将新值保存到ViewState变量中,这样在回发之后,dropdownlist将从ViewState中检索它所选的值(如果以前设置过)

但我无法将所选值存储在DropDownList 1中,因为在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);
        }
    }
}

受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!Page.IsPostBack)
{
BindData();
如果(视图状态[“列表1_值”]!=null)
{
ddl1.SelectedValue=ViewState[“List1_Value”]。ToString();
}
}
}
受保护的无效ddl1\u SelectedIndexChanged(对象发送方,事件参数e)
{
BindData();
ViewState[“List1_Value”]=ddl1.SelectedValue.ToString();
}
私有void SqlUpdate()
{
sql=String.Format(@“更新…”);
使用(ODBCCN)连接=
新OdbcConnection(ConfigurationManager.ConnectionString[“cn”].ConnectionString))
{
使用(OdbcCommand cmd=newodbccommand(sql,cn))
{
cmd.Connection.Open();
cmd.ExecuteNonQuery();
Page.ClientScript.RegisterStartupScript(this.GetType(),“Msg”,“alert('Ok');window.location='default.aspx';”,true);
}
}
}

您已经启用了自动回发功能,因此每次选择更改时,它都会回发到您的页面加载中。您只在该值不是回发时填写该值,因此这种情况永远不会发生

尝试将代码移动到
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();
}
正如其他人所提到的,您试图在只在不回发的情况下运行的条件内设置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将为空。

您所做的是从Javascript,在这种情况下,视图状态被删除,就像它是一个新请求一样

在这种情况下,唯一的方法是将其存储在会话中或作为参数发送到页面

最后,在更新数据库后,只需绑定一个GridView就很容易了

    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
    Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "alert('Ok.');", true); 
    BindData();  

您好,非常感谢您的回复。我已根据您的建议修改了代码,但没有任何更改,在DropDownList中更新后,我没有任何选定的值。@AntonioMailtraq:调试此程序时,具体在何处/如何失败?“它不起作用”不是有效的问题描述。我没有错误,只有我没有错误,只有ddl中的任何选定值。@AntonioMailtraq:如果您拒绝提供任何调试信息,这里没有人可以帮助您。您好,非常感谢您的回复。我根据您的建议修改了代码,但没有更改,在DropDownList中更新后,我没有更改任何选定值。@AntonioMailtraq-我更新了我的答案。您还需要将代码移到指定选定值的位置(在Page_Load中),使其不在!Page.IsPostBack条件下。