c# - example - dropdownlist mvc
llenado dinámico DropDownList no retiene valor en postback ASP.net c# (7)
EDIT 3: ¡FIJO!
Finalmente encontré cuál era el problema. Todos los controles estaban en un asp: Table, y tuve que EnableViewState = "true" en esta tabla para poder mantener el valor después de la devolución.
Gracias a todos por las respuestas !
En primer lugar, discúlpame si mi inglés no es perfecto, pero intentaré ser lo más preciso posible. Estoy luchando con mi problema desde ayer y he estado buscando en toda la web una respuesta.
Tengo un formulario que está hecho para "Crear un nuevo perfil". De esta forma tengo algunos DropDownLists y TextBoxes, mi problema es sobre DropDownLists.
4 DropDown están en mi página.
Vamos a centrarnos en los 2 últimos DropDown:
El primer DropDown llena dinámicamente el segundo en función de su valor.
vea esta imagen: 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>
Método de poblado:
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"));
}
Cuando selecciono un ítem en mi 2nd ddl y que ocurre un Postback (incluso si proviene de otras listas desplegables que mencioné antes), SelectedValue se convierte en el primer valor. ("Selectionnez ...")
Parece que mi 2nd DropDown está limitado en cada devolución, incluso si no es debido a SelectedIndexChanged de mi 1st DropDown. El SelectedIndexChanged the 1st DropDown siempre se llama en la devolución de datos y por lo que arroja "populateDdl ()" en cada PostBack (si es un valor es seleccionado).
Cuando hago clic en el botón de enviar, registra un valor en blanco en mi base de datos.
¿Qué me estoy perdiendo?
EDIT1:
Aquí está 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
}
}
y aquí está 1st 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();
}
}
EDICION 2:
Ver la siguiente imagen:
http://image.noelshack.com/fichiers/2013/22/1369830738-help2.png
Puedes ver que mi 2nd ddl ("Fonction") está correctamente llena PERO cuando hago clic en el botón de enviar: el valor se convierte en el valor nulo ("Sélectionnez ...") y mi RequiredFieldValidator hace que la página no sea válida.
Desde su marcado no ha configurado la propiedad AutoPostBack en el segundo menú desplegable. Por lo tanto, no se debe activar una publicación cuando haya cambiado el segundo índice desplegable (a menos que esté generando una publicación de forma programática).
He copiado tu código en mi solución, parece que se está comportando ...
<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>
Y el código ...
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"));
}
}
U puede usar CascadingDropDown como:
<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" />
poner este código bajo esta condición
if(!Page.IsPostBack)
{
// Your Code Here
}
usted es población DD1 en cada publicación posterior
para evitar este uso
if(!IsPostBack)
{
populateDdl();
}
if(!IsPostBack)
{
populateDdl();
}
Después de muchas horas tratando de descubrir un problema similar y por qué mi menú desplegable no cambiaba, revisé mis datos y, aunque la información de DataTextField era diferente, los valores de DataTextValues eran los mismos y solo estaba sacando el primero cada vez. Verifique sus datos y vea si tienen valores diferentes.
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