Comment puis-je obtenir la valeur sélectionnée de dropdownlist en mode d'édition d'un gridview?

Dans ma demande, quand je modifier une ligne dans le contrôle gridview je choisir quelques nouvelles données à partir d'un dropdownlist.

Je suis le remplissage de la liste déroulante comme ceci:

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

Mais lorsque j'appuie sur le bouton "modifier" à partir du modèle et entre dans le " RowUpdating de l'événement, la valeur sélectionnée de la dropdownlist est à chaque fois la première valeur de cette dropdownlist.

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
    }

Quelqu'un a une idée?

J'ai essayé de nombreuses façons de définir la valeur sélectionnée dans le " RowDataBound de l'événement, mais avec pas de chance. J'ai essayé ceci:

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

Grâce,
Jeff

Mise à jour

Mon modèle d'Élément de la page aspx:

 <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>
Avez-vous DataBind votre GridView dans chaque publication ou seulement si !Page.IsPostback? Vous ne devriez le faire que lors de la première fois et APRÈS que vous avez changé de source de données.
Oui, je suis de la liaison de données de la gridview à chaque page_Load
alors vous avez votre réponse 😉
Entourez-le à l'aide de if (!Page.IsPostBack){}
AAAA j'ai sauvé ma lifeee!! Je n'ai pas pensé que c'était stupide! merci beaucoup!

OriginalL'auteur Jeff Norman | 2011-05-12