¿Cómo puedo obtener el valor seleccionado de la lista desplegable en el modo de edición de una vista de cuadrícula?

StackOverflow https://stackoverflow.com/questions/5979048

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>
¿Fue útil?

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 Asegúrese de verificar cualquier otra ubicación Puede estar vinculante en cualquier parte de su código. Espero que esto ayude a alguien más.

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();
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top