¿Cómo puedo obtener el valor seleccionado de la lista desplegable en el modo de edición de una vista de cuadrícula?
-
12-11-2019 - |
Pregunta
En mi aplicación, cuando edito una fila en la vista de cuadrícula, elijo algunos datos nuevos de una lista desplegable.
Estoy completando el menú desplegable de esta manera:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if ((e.Row.RowState & DataControlRowState.Edit) > 0)
{
DropDownList emailsListDL = (DropDownList)e.Row.FindControl("emailsDL");
emailsListDL.DataSource = allUsersEmails;//list of strings with the emails of the users
emailsListDL.DataBind();
}
}
}
Pero cuando presiono el botón 'Actualizar' de la plantilla y entro en el evento 'RowUpdating', el valor seleccionado de la lista desplegable es cada vez el primer valor de esa lista desplegable.
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
DropDownList emailsListDL = (DropDownList)GridViewAdvertisers.Rows[e.RowIndex].FindControl("emailsDL");
string email = emailsListDL.SelectedValue; //the selected value is every time the first value from the dropdownlist
}
¿Alguien tiene alguna idea?
Probé muchas formas de establecer el valor seleccionado en el evento 'RowDataBound', pero no tuve suerte.Probé esto:
1. emailsListDL.SelectedIndex = emailsListDL.Items.IndexOf(emailsListDL.Items.FindByValue(DataBinder.Eval(e.Row.DataItem, "OwnerMail").ToString()));
2. emailsListDL.SelectedValue = GridViewAdvertisers.DataKeys[e.Row.RowIndex]["OwnerMail"].ToString();
3. emailsListDL.SelectedValue = GridViewAdvertisers.Rows[e.Row.RowIndex].Cells[1].Text;
//ownerMail is a string (object) from the list of objects that I put as datasource to the gridview
Gracias Jeff
Actualizar
Mi plantilla de artículo de la página aspx es:
<asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle"
ItemStyle-Width="150px" HeaderText="Owner Email" HeaderStyle-HorizontalAlign="Left"
HeaderStyle-BorderWidth="1px" HeaderStyle-BorderColor="#e1e1e1">
<ItemTemplate>
<asp:Label ID="LabelEmail" runat="server" Text='<%# Bind("OwnerMail")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="emailsDL" runat="server" Width="150">
</asp:DropDownList>
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Font-Bold="True"></HeaderStyle>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="180px" BorderWidth="1px"
BorderColor="#e1e1e1"></ItemStyle>
</asp:TemplateField>
Solución
El SelectedIndex siempre será de forma predeterminada a 0 si no lo defina en su definición de Lista DropDownList.
Editar: @tim Schmelter debería agregar su comentario como un anwer.Mientras tanto, voy a parfrasear para otros lectores: debe verificar el correo postal (ver comentarios anteriores).
Otros consejos
Puedes declarar un ComboBox mainBX = new Combobox();
y puedes declarar un evento
private void onSeletedIndexChange(object sender,EventArgs e)
{
mainBX = (ComboBox)(sender);
}
y luego debes iterar para cada ComboBox en GridView y agregar este evento.Entonces todo lo que debes hacer es tomar mainBX.seletedItem();
Creo que esto es lo que necesitas, si no, discúlpate.
Para establecer el valor seleccionado en el evento RowDataBound
-de, debe hacerlo así:
(DropDownList)e.Row.Cells[/*index*/].Controls[/*index, or use FindControl*/]).Items.FindByValue(((DataRowView)e.Row.DataItem).Row.ItemArray[/*columnnumber*/].ToString()).Selected = true;
FindByValue Encuentra el valor de texto actual del campo en el "Normal" ViewMode y establece la lista desplegable con el valor.
Por supuesto, esto debe ser encapsulado en
if ((e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit)
{
}
En cuanto a su "Obtención del valor en la actualización" -Problem, debo decir honestamente no tengo ni idea, ya que su enfoque es exactamente como el mío, solo la diferencia: las obras de la mina.
Aquí está mi código si es cualquier ayuda:
protected void gridVariables_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string control = ((DropDownList)gridVariables.Rows[e.RowIndex].Cells[3].Controls[1]).SelectedValue;
gridVariables.EditIndex = -1;
this.gridVariables_DataBind(control, e.RowIndex);
}
private void gridVariables_DataBind(string control, int index)
{
DataTable dt = (DataTable)Session["variableTable"]; //features a DataTable with the Contents of the Gridview
dt.Rows[index]["ControlType"] = control;
gridVariables.DataSource = dt;
gridVariables.DataBind();
}
Tuve el mismo problema con una solución diferente, había implementado la paginación personalizada en el GridView con un buscapersonas personalizadas, y en el proceso agregó el método RowCommand, que estaba recuperando la cuadrícula con un nuevo índice de páginas.Como sucede, aunque el método de Rowcommand también se llama durante la actualización.
SO protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
string commandName = e.CommandName;
switch (commandName)
{
case "Page1":
HandlePageCommand(e);
//binding should happen here
break;
}
//this line is in the wrong location, causing the bug
BindGrid1();
}