2011-04-13 41 views
6

Después de hacer una gran cantidad de investigación en línea, todavía estoy perplejo por este problema. Tengo una página que carga los nombres y el recuento de categorías en una lista desplegable. Solo hago esto si !(Page.IsPostBack). Cuando AutoPostBack dispara el SelectedIndex = 0. He intentado varias cosas diferentes. Aquí está mi código:Asp.NET DropDownList restablece SelectedIndex después de PostBack

PÁGINA

<form id="AddAssignmentForm" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server" /> 

<asp:UpdatePanel ID="CommentUpdate" runat="server"> 
<ContentTemplate> 

Add Comment 
<asp:DropDownList ID="ddlCategory" runat="server" Width="206" OnSelectedIndexChanged="ddlCategory_SelectedIndexChanged" AutoPostBack="true" /> 
<asp:TextBox ID="txtName" runat="server" Width="200" /> 
<asp:TextBox ID="txtAbbrv" runat="server" Width="200" /> 
<asp:TextBox ID="txtDescription" runat="server" Width="200" Height="90" TextMode="MultiLine" /> 

</ContentTemplate> 
</asp:UpdatePanel> 
</form> 

Aquí está el código de back-end.

private void Page_Load(object sender, System.EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     GetCategories(); 
    } 
} 

public void GetCategories() 
{ 
    String strSql = @"SELECT Name, Total 
         FROM MyTable"; 

    if (con.State == ConnectionState.Closed) 
     con.Open(); 

    OleDbCommand cmdsql = new OleDbCommand(strSql, con); 
    OleDbDataReader cmdReader = cmdsql.ExecuteReader(); 

    if (cmdReader.HasRows) 
    { 
     while (cmdReader.Read()) 
     { 
      ddlCategory.Items.Add(new ListItem(cmdReader["Category_Name"].ToString(), cmdReader["Total"].ToString())); 

     } 
     ddlCategory.SelectedIndex = -1; 
    } 


    cmdReader.Close(); 
    con.Close(); 
} 

public void FillForm(int index) 
{ 
    ListItem item = ddlCategory.Items[index]; 
    txtName.Text = item.Text + " " + (Convert.ToInt32(item.Value) + 1).ToString(); 
    txtAbbrv.Text = item.Text.Substring(0, 1) + (Convert.ToInt32(item.Value) + 1).ToString(); 
} 

public void ddlCategory_SelectedIndexChanged(Object sender, EventArgs e) 
{ 
    //When I break here SelectedIndex always = 1. 
    FillForm(ddlCategory.SelectedIndex); 
} 

Sólo quiero ser capaz de llenar el formulario basado en el índice seleccionado, pero me parece que no puede obtener la respuesta correcta. Cualquier ayuda es apreciada.

+0

estoy suponiendo que haya habilitado estado de vista? ¿Ha revisado la solicitud para ver cuál es el valor que se devuelve para ese control? ¿Cuántos elementos hay en el menú desplegable? – Dan

+0

Estoy bastante seguro de haber encontrado este problema antes. ¿Puedes intentar hacer que el panel de actualización sea condicional y configurar un desencadenante de publicación asincrónica en tu evento DropDownLists selectedindex changed? –

+0

Ahora mismo hay 4 artículos en el menú desplegable. No estoy seguro de a qué te refieres con consultar la solicitud para ver qué valor se devuelve. Revisé el ddlCategory.SelectedIndex en SelectedIndexChanged, y siempre es 1. – Genzume

Respuesta

3

Descubrí el problema. Los valores que se poblaron de mi declaración SQL contenían valores que se repiten. Por alguna razón, esto estaba causando que todo funcionara de manera extraña, lo que hizo que cada vez que seleccionara un ListItem toda la lista se reiniciara. Al asegurarse de que no se repitan los valores, el código comenzó a funcionar perfectamente. Gracias por la ayuda de todos.

1

¿Tiene Viewstate habilitado o deshabilitado? SelectedIndex está basado en cero, por lo que estaba restableciendo, creo que se establecería en cero.

Además, ¿en qué se establecen las otras propiedades de la lista desplegable? ¿El valor seleccionado es correcto?

Pruebe con un navegador diferente. Tuve un problema con los menús desplegables en cascada en los que no funcionaba/disparaba correctamente en Firefox.

+0

ViewState está habilitado. Si lo desactivo, mi lista se borrará en PostBack. – Genzume

+0

Lo probé en Internet Explorer y me sale el mismo problema. En este momento, SelectedIndexChanged ni siquiera se activa, ya que DropDownList simplemente se restablece a la selección superior cuando lo cambio. – Genzume

+1

Descubrí el problema. Los valores que se poblaron de mi declaración SQL contenían valores que se repiten. Por alguna razón, esto estaba causando que todo funcionara mal de maneras extrañas. Al asegurarse de que los valores nulos se convirtieran en 0, el código comenzó a funcionar perfectamente. Gracias por la ayuda de todos. – Genzume

11

Añadir AppendDataBoundItems = "true" para la lista desplegable

+2

esto solucionó totalmente mi problema !!! llené mi drowndownlist.datasource desde una lista de arrays. eso debe haber confundido los índices. configuración de appendatabounditems corregido wooooO! O !! # – austin

+1

Esta es mi respuesta correcta. – Jono

+0

¡Respuesta correcta! –

0

He estado experimentando el mismo problema, mi lista desplegable stateview salto en el índice 1 justo después de un evento de devolución de otro mando. Mi sugerencia simplemente es asegurarse de que los valores de su lista desplegable no estén vacíos.

Espero su ayuda a alguien .... :)

+0

Por favor, elabore su respuesta. No tiene sentido la pregunta que sugiere que hay valores vacíos. –

2

Asegúrese de que sus campos de valor son únicos para cada elemento de la lista desplegable. Si cada elemento tiene el mismo valor, estará predeterminado en el índice 0.

1

Esto me sucedió al intentar usar un valor de columna combinado para DataValueField. Por ejemplo:

El procedimiento almacenado se escribe así:

SELECT 
    Description, 
    Value1 + ',' + Value2 AS Value 
FROM 
    DropDownListTable 

Y la DataValueField utiliza el campo Valor que era una combinación de los campos Value1 y Value2 separados por una coma. (I también trató de una tubería y ningún delimitador, pero tuvo los mismos resultados)

With ddl 
    .DataTextField = "Description" 
    .DataValueField = "Value" 
    .DataSource = ds 
    .DataBind() 
End With 

Tan pronto como solía Valor1 o Valor2 como el DataValueField, el problema desapareció.

0

tuve problemas con esto también, probé EnableViewState="true" ViewStateMode="Enabled" pero no es necesario, de hecho, sólo hay que addd IsPostBack en el evento Load. No olvides agregar IsPostBack, eso es ...

if (!IsPostBack) 
{ 
    LoadDropDown(); 
} 
0

Usted tiene que cargar la lista en DropDownList si no IsPostBack

código Ejemplo:

if (!IsPostBack) 
{ 
    //fill here 
} 
Cuestiones relacionadas