2016-03-22 13 views
0

Dropdown-Liste, wie der ausgewählte Wert in ViewState gespeichert wird?Dropdown-Liste, wie der ausgewählte Wert in ViewState gespeichert wird?

Ich habe eine Dropdown-Liste, die bei der Änderung den neuen Wert in eine ViewState-Variable speichert, so dass nach einem Postback die Dropdown-Liste seinen ausgewählten Wert von ViewState abrufen wird, wenn zuvor festgelegt.

Aber ich kann den ausgewählten Wert nicht in DropDownList1_SelectedIndexChanged zu ViewState speichern, weil beim Laden der Seite (nach Update-Datenbank mit SQL-Abfrage-Update) in DropDownList ich keinen ausgewählten Wert haben.

Können Sie mir bitte helfen, das Problem zu lösen?

Vielen Dank im Voraus.

Mein Code unten.

<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); 
     } 
    } 
} 

Antwort

1

Was Sie tun, ist ein Postback von Javascript, in diesem Fall das Viewstate wird gelöscht, wie es ist, als ob es eine neue Anforderung war.

In diesem Fall ist die einzige Sache ist, es zu speichern, in Sitzung oder als Parameter auf der Seite senden.

Endlich nach einfach Update-Datenbank einen Grid Bindung ist es einfach:

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

Sie haben Autopostback aktiviert ist, so dass die Auswahl jedes Mal, es zurück zu Ihrem Page_Load postet ändern. Sie füllen nur den Wert aus, wenn es kein Postback ist, so wird dies nie auftreten.

Versuchen Sie, den Code zu verschieben, um den Wert außerhalb des Blocks if (!Page.IsPostBack) festzulegen. Vielleicht so etwas wie so:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     BindData(); 
    } 

    if (ViewState["List1_Value"] != null) 
    { 
     ddl1.SelectedValue = ViewState["List1_Value"].ToString(); 
    } 
} 
0

entfernen BindData() von Ihrer SelectedIndexChanged Methode:

protected void ddl1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    ViewState["List1_Value"] = ddl1.SelectedValue.ToString(); 
} 

Und wie andere schon erwähnt haben, versuchen Sie ddl1.SelectedValue in einem Zustand zu setzen, die nicht läuft nur in Postback , was bedeutet, dass der ausgewählte Wert beim Postback nie erfasst wird. Sie sollten das also auch ansprechen, indem Sie es außerhalb der! Page.IsPostBack-Bedingung verschieben.

+0

Hallo, für die Antwort dich so sehr danken. Ich habe den Code mit Ihrem Vorschlag geändert, aber ich habe keine Änderungen, nach dem Update in DropDownList habe ich keinen ausgewählten Wert. –

+0

@AntonioMailtraq - Ich habe meine Antwort aktualisiert. Sie müssen auch den Code verschieben, dem Sie den ausgewählten Wert zuweisen (in PageLoad), sodass er außerhalb der! Page.IsPostBack-Bedingung liegt. –

0

wenn die Seite neu laden (nach Update-Datenbank mit SQL-Abfrage-Update) in Dropdownlist Ich habe keinen ausgewählten Wert

Vermutlich bist du „Nachladen“ in einem von zwei Möglichkeiten:

1. Verursachung einer Post-Zurück

Dies wird nicht in Ihrem Fall arbeiten, weil Sie nicht sind der Wert in einer post-back mit:

if (!Page.IsPostBack) 
{ 
    BindData(); 

    if (ViewState["List1_Value"] != null) 
    { 
     ddl1.SelectedValue = ViewState["List1_Value"].ToString(); 
    } 
} 

Wenn Sie den gewählten Wert in einer post-zurück binden möchten dann müssen Sie außerhalb dieses bedingten diesen Code verschieben:

if (!Page.IsPostBack) 
{ 
    BindData(); 
} 
if (ViewState["List1_Value"] != null) 
{ 
    ddl1.SelectedValue = ViewState["List1_Value"].ToString(); 
} 

2. einen neuen Antrag zu machen

Wenn Sie manuell sind "Neuladen" der Seite durch einfaches erneutes Anfordern der Seite aus der Adressleiste des Browsers, dann wird der ViewState leer sein. ViewState ist Teil der Formularwerte in einer POST-Anforderung, aber beim Laden einer Seite aus der Adressleiste wird eine GET-Anforderung ohne Werte ausgegeben. Also wird der ViewState leer sein.

+0

Hallo, vielen Dank für die Antwort. Ich habe den Code mit Ihrem Vorschlag geändert, aber ich habe keine Änderungen, nach dem Update in DropDownList habe ich keinen ausgewählten Wert. –

+0

@AntonioMailtraq: Wenn Sie dies * debuggen *, wo/wie * speziell * schlägt es fehl? "Es funktioniert nicht" ist keine gültige Problembeschreibung. – David

+0

Ich habe keinen Fehler nur ich habe keinen Fehler nur einen ausgewählten Wert in ddl. –