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
dynamically filled DropDownList does not retain value on postback
提问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 setEnableViewState="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 必须是所有条目的唯一值。

