2013-05-29 42 views
3

編輯3:固定!動態填充DropDownList不保留價值回發ASP.net c#

我終於找到了問題所在。 每個控件都在asp:Table中,並且我必須在此表上使用EnableViewState =「true」,以便能夠在回發後保留該值。

謝謝大家的答案!


首先,原諒我,如果我的英文不是很好,但我會努力成爲最精確。 我從昨天起就與我的問題鬥爭,並一直在搜索網絡上的所有答案..

我有一個窗體,這是「創建一個新的配置文件」。在這個表單中我有一些DropDownLists和TextBoxes,我的問題是關於DropDownLists。

4 DropDown在我的頁面上。

讓我們專注於去年2下拉:

第一個下拉動態填充它的價值函數的第二個。

看到這樣的畫面: http://image.noelshack.com/fichiers/2013/22/1369819471-picture-help.png

第一DDL:

<asp:DropDownList ID="ddlTypePN" runat="server" DataSourceID="SqlTypePN" EnableViewState="true" 
     DataTextField="libelle" DataValueField="valeur" AutoPostBack="true" OnSelectedIndexChanged="ddlTypePN_SelectedIndexChanged" 
     OnDataBound="ddlTypePN_DataBound" > </asp:DropDownList> 

第二DDL:

<asp:DropDownList runat="server" ID="ddlFctPN" AppendDataBoundItems="false" OnDataBound="ddlFctPN_DataBound" > </asp:DropDownList> 

填充方法:

void populateDdl() 
{ 

string val = "fct"+ddlTypePN.SelectedValue.ToString().Trim(); // Used for SELECT 
SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["My_DB"].ConnectionString); 

ddlFctPN.Items.Clear(); 

     DataTable subjects = new DataTable(); 
      try 
      { 
       SqlDataAdapter adapter = new SqlDataAdapter("My SELECT", sqlConn); 
       adapter.Fill(subjects); 

       ddlFctPN.DataSource = subjects; 
       ddlFctPN.DataTextField = "libelle"; 
       ddlFctPN.DataValueField = "valeur"; 
       ddlFctPN.DataBind(); 
      } 
      catch (Exception ex) 
      { 
       lblErr.Text = ex.Message; 
      } 


ddlFctPN.Items.Insert(0, new ListItem("Sélectionnez...", "null")); 

} 

當我在第二個ddl中選擇一個項目並且發生回發時(即使它來自我之前提到的其他下拉列表),SelectedValue成爲第一個值。 (「Selectionnez ...」)

這似乎是我的第二個下拉列表僅在每次回發界,即使是因爲我的第一個下拉的的SelectedIndexChanged不.. 的的SelectedIndexChanged第一下拉總是叫上回發,所以它在每個PostBack中拋出「populateDdl()」(如果選擇了一個值)。

當我點擊提交按鈕,它在我的數據庫中註冊一個空值。

我錯過了什麼?

EDIT1:

這裏是pageLoad的:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      ddlTypeProf.DataBind(); // don't care 
      ddlSsoSrc.DataBind(); // don't care 
      ddlTypePN.DataBind(); // The ddl that populate my 2nd ddl 

     } 
    } 

,這裏是第一個DDL的SelectedIndexChanged:

protected void ddlTypePN_SelectedIndexChanged(object sender, EventArgs e) 
    { 

      string type = ddlTypePN.SelectedValue.ToString().Trim(); 

      // if PNT 
      if (type.ToUpper().Trim().Equals("PNT")) 
      {    
       ddlFctPN.Enabled = true; 
       ddlTypeAv.Enabled = true; 
       rfvTypeAv.Enabled = true; 
       populateDdl(); 

      } 
      else if (type.ToUpper().Trim().Equals("PNC")) 
      {     
       ddlFctPN.Enabled = true; 
       ddlTypeAv.Enabled = false; 
       rfvTypeAv.Enabled = false; 
       populateDdl(); 
      }   


    } 

編輯2:

見FOLL由於圖片:

http://image.noelshack.com/fichiers/2013/22/1369830738-help2.png

你可以看到,我的第二個DDL(「Fonction」)填寫正確,但是當我點擊提交按鈕:值變爲空值(「Sélectionnez......」)所以我的RequiredFieldValidator使頁面無效!

回答

1

把這個代碼在此條件下

if(!Page.IsPostBack) 
      { 

     // Your Code Here 

      } 
+0

我已經嘗試過!的IsPostBack,但仍是同樣的問題。 我不明白爲什麼我應該把這段代碼放在裏面!IsPostBack是因爲如果我填充第二個ddl時,我的第一個SelectedIndexChanged被拋出,它被填充到PostBack上?我錯了嗎? –

+0

你還卡住了嗎? –

2
if(!IsPostBack) 

{ 

    populateDdl(); 

} 
1

U可以使用CascadingDropDown像:

<ajaxToolkit:CascadingDropDown ID="CDD1" runat="server" 
    TargetControlID="DropDownList2" 
    Category="Model" 
    PromptText="Please select a model" 
    LoadingText="[Loading models...]" 
    ServicePath="CarsService.asmx" 
    ServiceMethod="GetDropDownContents" 
    ParentControlID="DropDownList1" 
    SelectedValue="SomeValue" /> 
+0

我讀到CascadingDropDown無法在沒有WebService的情況下工作.. –

2

你是人口DD1在每一個崗位回到

避免這種使用

if(!IsPostBack)  
{ 
    populateDdl(); 
} 
1

從標記起,您沒有在第二個下拉列表中設置AutoPostBack屬性。因此,當第二個下拉索引已更改時(除非您以編程方式導致回發),它不應該發回帖子。

我複製你的代碼到我的解決方案,它似乎是表現...

<asp:Label ID="lblErr" runat="server"></asp:Label> 
<asp:DropDownList ID="ddlTypePN" runat="server" EnableViewState="true" 
    AutoPostBack="true" OnSelectedIndexChanged="ddlTypePN_SelectedIndexChanged" 
    OnDataBound="ddlTypePN_DataBound"> 
</asp:DropDownList> 

<asp:DropDownList runat="server" ID="ddlFctPN" AppendDataBoundItems="false" OnDataBound="ddlFctPN_DataBound"> 
</asp:DropDownList> 

和代碼...

protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       ListItemCollection items = new ListItemCollection(); 
       items.Add(new ListItem("PNT", "PNT")); 
       items.Add(new ListItem("PNC", "PNC")); 

       ddlTypePN.DataSource = items; 
       ddlFctPN.DataBind(); 
       ddlTypePN.DataBind(); // The ddl that populate my 2nd ddl 

       ddlTypePN.Items.Insert(0, new ListItem("Sélectionnez...", "null")); 
      } 
     } 

     protected void ddlTypePN_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      string type = ddlTypePN.SelectedValue.ToString().Trim(); 

      // if PNT 
      if (type.ToUpper().Trim().Equals("PNT")) 
      { 
       ddlFctPN.Enabled = true; 
       populateDdl(); 

      } 
      else if (type.ToUpper().Trim().Equals("PNC")) 
      { 
       ddlFctPN.Enabled = true; 
       populateDdl(); 
      }   
     } 

     protected void ddlTypePN_DataBound(object sender, EventArgs e) 
     { 

     } 

     protected void ddlFctPN_DataBound(object sender, EventArgs e) 
     { 

     } 

     void populateDdl() 
     { 

      ddlFctPN.Items.Clear(); 
      lblErr.Visible = false; 

      try 
      { 
       ListItemCollection items = new ListItemCollection(); 
       items.Add(new ListItem("One", "1")); 
       items.Add(new ListItem("Two", "2")); 
       items.Add(new ListItem("Three", "3")); 

       ddlFctPN.DataSource = items; 
       ddlFctPN.DataBind(); 
      } 
      catch (Exception ex) 
      { 
       lblErr.Text = ex.Message; 
       lblErr.Visible = true; 
      } 


      ddlFctPN.Items.Insert(0, new ListItem("Sélectionnez...", "null")); 

     } 

    } 
+0

第二個列表不會拋出回發,如果它是「PNT」或「PNC」 –

0

很多時間試圖弄清楚後一個類似的問題,爲什麼我的下拉列表不會改變,我檢查了我的數據,當DataTextField信息不同時,DataTextValues是相同的,它只是每次都拉第一個。檢查你的數據,看看它們是否有不同的值。

+0

感謝您的回答,但這是我第一次爲了填充第二個具有不同值的第一個回答,但我解決了我的問題,因爲很長一段時間:) 當我問這個問題時,我是一個新手,解決方案非常簡單... –

0

確定solucion

<script type="text/javascript"> 
    function MtCambioRegion() { 
     // con JQUERY 



     //var regionId = $('#<%= ddlregion.ClientID %>').val(); 
     // sin JQUERY 
     var regionId = document.getElementById('ContentBody_ddlRegion').value; 
     // var regionId = document.getElementById('ContentBody_CtrContenedoAjax_ddlRegion').value 
     // alert('metodo region : ' + regionId); 
     GetCitiesOfRegion(regionId); 
    } 

    function GetCitiesOfRegion(regionId) { 
     // alert('Funcion ' + regionId); 
     var actionData = "{'regionId': '" + regionId + "'}"; 
     $.ajax({ 
      type: "POST", 
      url: "WebTespRegionComuna.aspx/GetProComunas", 
      data: actionData, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (r) { 
       var ddlComuna = $("[id*=ddlComuna]"); 
       ddlComuna.empty().append(''); 

       $.each(r.d, function() { 
        ddlComuna.append($("<option></option>").val(this['id']).html(this['nombre'])); 
       }); 
      } 
     }); 

    } 

    function FnSelComuna() { 
     var x = document.getElementById("ContentBody_ddlComuna").value; 
     // alert(x); 
     document.getElementById('ContentBody_txtComunaHiden').value = x; 
    } 

// formulario ASPX

Public Class WebTespRegionComuna 
Inherits System.Web.UI.Page 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not Page.IsPostBack Then 
     'ControlSystema.GetSearhRegionList(ddlRegion) 

     Dim _ControlSystema As New ControlSystema 
     With _ControlSystema 
      .MtRegionList(ddlRegion) 
     End With 
     _ControlSystema = Nothing 


    End If 

End Sub 


<System.Web.Services.WebMethod()> _ 
Public Shared Function GetProComunas(regionId As String) As List(Of ComunaList) 
    Dim _ControlSystema As New ControlSystema 
    Dim _lista As List(Of ComunaList) 
    With _ControlSystema 
     _lista = .GetSearchComunaList(regionId) 
    End With 
    _ControlSystema = Nothing 
    Return _lista 
End Function 

Private Sub btnGuardarDatos_Click(sender As Object, e As System.EventArgs) Handles btnGuardarDatos.Click 
    Try 
     Dim valorcomuna As String = ddlComuna.SelectedValue 
     valorcomuna = txtComunaHiden.Text 


     Dim valorregion As String = ddlRegion.SelectedValue.ToString() 
     Dim _valor As String = "punto de quiebre" 

    Catch ex As Exception 

    End Try 
End Sub End Class 
相關問題