簡體   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