Error de Compilacion (No me toma SelectedItem de DropDownList)

Iniciado por Guillito, 3 Marzo 2015, 04:31 AM

0 Miembros y 1 Visitante están viendo este tema.

Guillito

Hola, como les va..............cuando compilo para probar como funciona el código para llenar una tabla, cuando arribo a esta parte del Codigo, me da el siguiente Error:


Compiler Error Message: CS0029: Cannot implicitly convert type 'System.Web.UI.WebControls.ListItem' to 'System.Web.UI.WebControls.DropDownList'

Source Error:

Line 140:            // Se obtiene la fila seleccionada del DropDownList
Line 141:
Line 142:  DropDownList drop = DropDownNombre.SelectedItem;(Aquí el error)
Line 143:
Line 144:            // Obtengo el id de la entidad que se esta editando




Aquí el código cuestionado:


Código


Código (csharp) [Seleccionar]


protected void DropDownNombre_SelectedIndexChanged(object sender, EventArgs e)

      {

// Se obtiene la fila seleccionada del DropDownList

          DropDownList drop = DropDownNombre.SelectedItem;

// Obtengo el id de la entidad que se esta editando

// en este caso de la entidad Curso



ViewState["idNombre"] = Convert.ToInt32(drop.SelectedItem);

}




este es el problema, la intención es tomar el Id de la Tabla del Ítem seleccionado..................

si alguien sabe cual es el problema, o el código adecuado, o como se soluciona, les agradecería su aporte.......

Sin mas que agregar, espero vuestra devolución, saludos....

Eleкtro

#1
El error es self-explanatory, se explica por si mismo, no puedes convertir un ListItem (es decir, el Item seleccionado de un DropDownList) a un Control de tipo DropDownList, no tiene sentido.

No manejo ASP.Net, pero el problema es sencillo de entender y corregir, prueba así:
Código (csharp) [Seleccionar]
ListItem currentItem = ((DropDownList)sender).SelectedItem;

ViewState["idNombre"] = Convert.ToInt32(currentItem);


PD: La próxima vez trata de publicar bien el código... la mitad de los keywords estaban pegados los unos a los otros y no se entendia.

Saludos








Guillito

#2
Hola Elektro, siguiendo tu sugerencia, cuando compilo y elijo un Ítem del DropDownList, se ejecuta esa acción, y me da el siguiente error:

Unable to cast object of type 'System.Web.UI.WebControls.ListItem' to type 'System.IConvertible'.

Aquí, en:

ViewState["idNombre"] = Convert.ToInt32(currentItem);

en (currentItem), el valor del mismo es (con punto de interrupcion) el Nombre propiamente dicho (o sea, la palabra del Nombre) y no su Id en la Tabla de donde es llamado, que es lo que quiero obtener para que me cargue en el ViewState (el Id de la Tabla de ese Ítem seleccionado).......

Asi mismo, cuando selecciono el Ítem del DropDownList, se dispara la acción y me da el error, pero no se queda estatico sin dispararse, cosa que pueda elegir el Ítem del DropDownList del Apellido, que esta al lado.......

Si sabes algo, te agradezco...........Perdon por haber posteado algo mal con el código la primera vez, soy nuevo posteando....saludos y gracias....... ;-) :silbar:

Eleкtro

#3
Cita de: Guillito en  4 Marzo 2015, 04:19 AM
Unable to cast object of type 'System.Web.UI.WebControls.ListItem' to type 'System.IConvertible'.

Aquí, en:

ViewState["idNombre"] = Convert.ToInt32(currentItem);

en (currentItem), el valor del mismo es (con punto de interrupcion) el Nombre propiamente dicho (o sea, la palabra del Nombre) y no su Id en la Tabla de donde es llamado, que es lo que quiero obtener para que me cargue en el ViewState (el Id de la Tabla de ese Ítem seleccionado).......

Creo que entendí mal lo que dijiste, pensé que el valor del item (currentItem) contendría un dígito, y no una cadena con "un nombre" (obviamente por eso no funciona la conversión a Integer, por que no es un número), pero tú lo que quieres obtener es el índice de ese item, no el contenido del item, bien, me queda claro.

Cómo ya te dije, no manejo ASP.Net, pero los controles de Framework suelen tener métodos/propiedades para facilitar tareas de indexación cómo esa y no es dificil averiguar el cómo,
lee la documentación de la propiedad 'SelectedIndex', que devuelve el índice del item seleccionado:
https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.dropdownlist.selectedindex%28v=vs.110%29.aspx

Por ende, esto debería funcionarte:

Código (csharp) [Seleccionar]
// ListItem currentItem = ((DropDownList)sender).SelectedItem;
ListItem currentIndex = ((DropDownList)sender).SelectedIndex;
   
ViewState["idNombre"] = currentIndex;


Saludos








Guillito

Hola Elektro:

Ahora me da el sig. Error:

Compiler Error Message: CS0029: Cannot implicitly convert type 'int' to 'System.Web.UI.WebControls.ListItem'


Código (csharp) [Seleccionar]


ListItem currentIndex = ((DropDownList)sender).SelectedIndex;
           
ViewState["idNombre"] = currentIndex;

      (En la primera Línea)...............


De cualquier forma, Elektro, lo que quiero obtener de los DropsDown son los Ids. de la Tabla, mas no el Indice de los Ítems de los DropDowns......


Desde ya te estoy agradeciendo muchísimo, y me estoy fijando en el enlace que me mandaste, a ver si encuentro algo.....

Un abrazo grande, seguimos en contacto....





Eleкtro

Cita de: Guillito en  5 Marzo 2015, 02:23 AMAhora me da el sig. Error:

Compiler Error Message: CS0029: Cannot implicitly convert type 'int' to 'System.Web.UI.WebControls.ListItem'

ListItem currentIndex = ((DropDownList)sender).SelectedIndex;

tuve un descuido muy tonto, asigné el type ListItem y no Int, pero eso deberías haber podido darte cuenta por ti mismo...

Código (csharp) [Seleccionar]
int currentIndex = ((DropDownList)sender).SelectedIndex;

saludos








Guillito

#6
 ;-)  Hola, Elektro:

te pregunto lo siguiente:

Para que funcione el código anterior que me enviaste,

debo llenar los DropDownList de la siguiente manera?(Es decir, con el Id de la Tabla, o sea Id_Alumno??):

Código (csharp) [Seleccionar]

DropDownNombre.DataSource = b.fillListView("Select Id_Alumno, Nombre From Alumno Order By Nombre Asc");
DropDownNombre.DataBind();


dado que con lo que me enviaste funcionaria, pero me da otro tipo de error, por ejemplo:

"No se puede agregar o cambiar el registro porque se necesita un registro relacionado en la tabla 'Alumno'."

Y este seria todo el código con tus sugerencias:

Código (csharp) [Seleccionar]

protected void ButtonTodas_Click(object sender, EventArgs e)
       {
           string a = ViewState["idNombre"].ToString();
           string b = ViewState["idApellido"].ToString();
           a = b;
           ViewState["idAlumno"] = ViewState["idNombre"];

           if (a != b)
           {
               ViewState["idAlumno"] = null;
           }
           else
           {
               foreach
               (GridViewRow dgi in GridInscMaterias.Rows)
               {

                   CheckBox myCheckBox = dgi.Cells[0].Controls[1] as CheckBox;

                   if (myCheckBox != null)
                   {

                       if (myCheckBox.Checked == true)
                       {

                           ViewState["idMateria"] = GridInscMaterias.DataKeys[dgi.RowIndex][0].ToString();
                           {
                               string cadenaConexion = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
                               OleDbConnection cnn = new OleDbConnection(cadenaConexion);
                               cnn.Open();
                               string SQL = string.Empty;
                               SQL = ("SELECT id_cursoMateria From CursosMaterias cm Where cm.id_Curso = @idCurso AND cm.id_Materia = @idMateria");

                               ViewState["idCursoMateria"] = SQL;

                               string sql = string.Empty;
                               sql = @"INSERT INTO AlumMatCursos (Id_Alumno, id_cursoMateria)
                               VALUES (@idAlumno, @idcurMat)";
                               OleDbCommand cmd = new OleDbCommand(sql, cnn);
                               cmd.Parameters.AddWithValue("@idCurso", (ViewState["idCurso"]));
                               cmd.Parameters.AddWithValue("@idMateria", (ViewState["idMateria"]));
                               cmd.Parameters.AddWithValue("@idAlumno", (ViewState["idAlumno"]));
                               cmd.Parameters.AddWithValue("@idcurMat", (ViewState["idCursoMateria"]));
                               cmd.ExecuteNonQuery();
                               cnn.Close();
                               lblMensaje.Text = "Se registraron correctamente en BD!";
}
                       }
                   }
               }
           }
       }        

       protected void DropDownNombre_SelectedIndexChanged(object sender,    EventArgs e)
       {
           // Se obtiene la fila seleccionada del DropDownList
           int currentIndex = ((DropDownList)sender).SelectedIndex;
                       
           ViewState["idNombre"] = currentIndex;

           //ViewState["idNombre"] = Convert.ToInt32(DropDownNombre.SelectedValue);

       }
       protected void DropDownApellido_SelectedIndexChanged(object sender, EventArgs e)
       {
           // Se obtiene la fila seleccionada del DropDownList
           int currentIndex = ((DropDownList)sender).SelectedIndex;
           
           ViewState["idApellido"] = currentIndex;

       }
   }
}


Sera que me esta tomando el índice del Ítem???....(y no de la tabla??).....



Desde ya te estoy agradeciendo, disculpa las molestias, nos estamos viendo....

Guillito