动态填充DropDownList不会在回发ASP.net上保留值c#

时间:2013-05-29 09:47:14

标签: c# asp.net drop-down-menu postback

编辑3:固定!

我终于找到了问题所在。 每个控件都在asp:Table中,并且我必须在此表上使用EnableViewState =“true”才能在回发后保留值。

谢谢大家的答案!


首先,请原谅我,如果我的英语不完美,但我会尽量做到最精确。 我从昨天开始就在解决我的问题,并一直在网上寻找答案..

我有一个“创建新个人资料”的表单。在这个表单中我有一些DropDownLists和TextBoxes,我的问题是关于DropDownLists。

4 DropDown在我的页面上。

让我们关注最后一个DropDown:

第一个DropDown根据其值动态填充第二个DropDown。

看到这张图: http://image.noelshack.com/fichiers/2013/22/1369819471-picture-help.png

1st 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> 

2nd 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中选择一个项目并且发生PostBack时(即使它来自我之前提到的其他下拉列表),SelectedValue成为第一个值。 ( “Selectionnez ...”)

似乎我的第二个DropDown在每个回发都受到限制,即使它不是因为我的第一个DropDown的SelectedIndexChanged。 SelectedIndexChanged第一个DropDown总是在回发时被调用,因此它会在每个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:

见下图:

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

你可以看到我的第二个ddl(“Fonction”)被正确填充但是当我点击提交按钮时:该值变为空值(“Sélectionnez...”),因此我的RequiredFieldValidator使页面无效!

9 个答案:

答案 0 :(得分:2)

if(!IsPostBack)

 {

  populateDdl();

 }

答案 1 :(得分:2)

每个帖子都是人口DD1

避免这种使用

if(!IsPostBack)    
 {
   populateDdl();
 }

答案 2 :(得分:1)

将此代码置于此条件下

if(!Page.IsPostBack)
            {

       // Your Code Here

            }

答案 3 :(得分:1)

你可以使用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" />

答案 4 :(得分: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"));

        }

    }

答案 5 :(得分:0)

经过几个小时试图找出类似的问题以及为什么我的下拉列表不会改变,我检查了我的数据,而DataTextField信息不同,DataTextValues是相同的,它只是拉第一个每一次。检查您的数据,看看它们是否有不同的值。

答案 6 :(得分:0)

ok 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

答案 7 :(得分:0)

就我而言,发生此问题是因为分配给下拉列表的DataValueField值为空。 dropdownName.DataValueField对于所有条目都必须是唯一的。

答案 8 :(得分:-1)

解决方案从问题中移到答案:

我终于找到了问题所在。每个控件都位于<asp:Table>中,我必须在此表上设置EnableViewState="true",以便能够在回发后保留该值。