C# 动态填充的 DropDownList 在回发时不保留值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16810626/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 07:50:17  来源:igfitidea点击:

dynamically filled DropDownList does not retain value on postback

c#asp.netdrop-down-menupostback

提问by Flo

I have a form which is made to "Create a new profile". My problem is about DropDownLists.

我有一个用于“创建新配置文件”的表单。我的问题是关于 DropDownLists。

The first DropDown dynamically populate the second one in function of its value.

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

see this picture:

看这张图片:

http://image.noelshack.com/fichiers/2013/22/1369819471-picture-help.png

http://image.noelshack.com/fichiers/2013/22/1369819471-picture-help.png

And the following picture:

还有下图:

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

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

You can see that my 2nd ddl ("Fonction") is correctly filled BUT when I click on the submit button, the value becomes the null value ("Sélectionnez...") and so my RequiredFieldValidator makes the page not valid!

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

It seems like my 2nd DropDownList is bounded on every postback even if it's not because of SelectedIndexChanged of my 1st DropDownList. The SelectedIndexChanged of the 1st DropDownList is always called on postback and so it throws "populateDdl()" at every PostBack (if a value is selected).

即使不是因为我的第一个 DropDownList 的 SelectedIndexChanged,我的第二个 DropDownList 似乎在每次回发时都有界。第一个 DropDownList 的 SelectedIndexChanged 总是在回发时调用,因此它在每个回发时抛出“populateDdl()”(如果选择了一个值)。

When I click on submit button, it registers a blank value in my database.

当我单击提交按钮时,它会在我的数据库中注册一个空白值。

What am I missing?

我错过了什么?

Aspx code:

ASP代码:

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

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

Code behind:

后面的代码:

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

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

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

采纳答案by TylerH

Solution moved to an answer from the question:

解决方案移至问题的答案:

I finally found what the problem was. Every control was in an <asp:Table>, and I had to set EnableViewState="true"on this table in order to be able to keep the value after postback.

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

回答by Mahmoude Elghandour

put this code under this condition

将此代码置于此条件下

if(!Page.IsPostBack)
            {

       // Your Code Here

            }

回答by Ayyappan Sekaran

if(!IsPostBack)

 {

  populateDdl();

 }

回答by Roar

U can use CascadingDropDownlike:

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

回答by vishal mane

you are population DD1 in every post back

你在每个回帖中都是人口 DD1

to avoid this use

避免这种使用

if(!IsPostBack)    
 {
   populateDdl();
 }

回答by ronnie

From your mark up you haven't set the AutoPostBack property on the second drop down. So it shouldn't fire a post back when the second drop down index has changed (unless you are programmatically causing a post back).

从您的标记开始,您尚未在第二个下拉列表中设置 AutoPostBack 属性。因此,当第二个下拉索引发生变化时,它不应触发回发(除非您以编程方式导致回发)。

I've copied your code into my solution, it seems to be behaving...

我已将您的代码复制到我的解决方案中,它似乎正在运行...

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

And the code...

还有代码...

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

        }

    }

回答by Charlie

After many hours of trying to figure out a similar problem and why my dropdown wouldn't change, I checked my data and while the DataTextField info was different, the DataTextValues were the same and it was just pulling the first one each time. Check your data and see if they have different values.

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

回答by fernando yevenes

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

// 公式 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

回答by Kavya_D

In my case this issue occurred because the DataValueField values assigned to drop down were empty dropdownName.DataValueField must be unique for all entries.

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