2008-10-05 12 views
7

Voici mon code dans un gridview qui est lié à l'exécution:Comment lier un DropDownList dans un GridView dans le champ EditItemTemplate?

... 
<asp:templatefield> 
    <edititemtemplate> 
     <asp:dropdownlist runat="server" id="ddgvOpp" /> 
    </edititemtemplate> 
    <itemtemplate> 
     <%# Eval("opponent.name") %> 
    </itemtemplate> 
</asp:templatefield> 
... 

Je veux lier le dropdownlist « ddgvOpp » mais je ne sais pas comment. Je devrais, mais je ne le fais pas. Voici ce que j'ai, mais je continue à obtenir une erreur « de référence de l'objet », ce qui est logique:

protected void gvResults_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) //skip header row 
    { 
     DropDownList ddOpp = (DropDownList)e.Row.Cells[5].FindControl("ddgvOpp"); 
     BindOpponentDD(ddOpp); 
    } 
} 

BindOpponentDD() est juste où le DropDownList se peuplé. Est-ce que je ne fais pas ça au bon moment? Sinon, de quoi ai-je besoin pour le mettre?

Merci beaucoup à l'avance ...

Répondre

5

Ok, je crois que je suis stupide. Je l'ai compris.

En cas RowDataBound, il suffit d'ajouter ce qui suit conditionnel:

if (myGridView.EditIndex == e.Row.RowIndex) 
{ 
    //do work 
} 
+0

Je pense que vous aussi ne pas besoin (e.Row.RowType == DataControlRowType.DataRow), sauf si vous avez piraté des lignes d'en-tête modifiables en quelque sorte. – quillbreaker

+0

non parce que cela commence avec la ligne d'en-tête et descend vers le bas. vous obtenez une erreur si vous ne le faites pas, ou cela ne fonctionne tout simplement pas. – Jason

+0

Ou vous pouvez vérifier si la ligne est en mode d'édition par ce 'if (e.RowState && DataControlRowState.Edit)> 0 {}' –

1
protected void grdDevelopment_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (grdDevelopment.EditIndex == e.Row.RowIndex && e.Row.RowType==DataControlRowType.DataRow) 
    {  
     DropDownList drpBuildServers = (DropDownList)e.Row.Cells[0].FindControl("ddlBuildServers"); 
    } 
} 

Essayez celui

Cela vous aidera u

1

J'ai eu le même problème, mais ce correctif (Jason, qui ajoute le conditionnel au gestionnaire) n'a pas fonctionné pour moi; la ligne Edit n'a jamais été databound, donc cette condition n'a jamais été évaluée à true. RowDataBound n'a tout simplement jamais été appelé avec le même RowIndex que GridView.EditIndex. Ma configuration est un peu différente, cependant, au lieu de lier par programmation la liste déroulante je l'ai lié à un ObjectDataSource sur la page. La liste déroulante doit toujours être liée séparément par ligne, car ses valeurs possibles dépendent des autres informations de la ligne. Donc l'objet ObjectDataSource a un SessionParameter, et je m'assure de définir la variable de session appropriée quand nécessaire pour la liaison.

<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName"> 
<SelectParameters> 
    <asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" /> 
</SelectParameters> 

Et le menu déroulant dans la ligne correspondante:

<asp:TemplateField HeaderText="My Info" SortExpression="MyInfo"> 
     <EditItemTemplate> 
      <asp:DropDownList ID="ddlEditMyInfo" runat="server" DataSourceID="objInfo" DataTextField="MyInfo" DataValueField="MyInfoID" SelectedValue='<%#Bind("ID") %>' /> 
     </EditItemTemplate> 
     <ItemTemplate> 
      <span><%#Eval("MyInfo") %></span> 
     </ItemTemplate> 
    </asp:TemplateField> 

Ce que je fini par faire était de ne pas utiliser un CommandField dans le GridView pour générer mon éditer, supprimer, mettre à jour et annuler boutons ; Je l'ai fait moi-même avec un TemplateField, et en définissant les CommandNames de manière appropriée, j'ai été capable de déclencher les actions intégrées edit/delete/update/cancel sur le GridView. Pour le bouton Modifier, j'ai fait à CommandArgument les informations dont j'avais besoin pour lier le menu déroulant, au lieu du PK de la ligne comme il le ferait habituellement. Cela n'a heureusement pas empêché GridView de modifier la ligne appropriée.

<asp:TemplateField> 
     <ItemTemplate> 
      <asp:ImageButton ID="ibtnDelete" runat="server" ImageUrl="~/images/delete.gif" AlternateText="Delete" CommandArgument='<%#Eval("UniqueID") %>' CommandName="Delete" /> 
      <asp:ImageButton ID="ibtnEdit" runat="server" ImageUrl="~/images/edit.gif" AlternateText="Edit" CommandArgument='<%#Eval("MyID") %>' CommandName="Edit" /> 
     </ItemTemplate> 
     <EditItemTemplate> 
      <asp:ImageButton ID="ibtnUpdate" runat="server" ImageUrl="~/images/update.gif" AlternateText="Update" CommandArgument='<%#Eval("UniqueID") %>' CommandName="Update" /> 
      <asp:ImageButton ID="ibtnCancel" runat="server" ImageUrl="~/images/cancel.gif" AlternateText="Cancel" CommandName="Cancel" /> 
     </EditItemTemplate> 
    </asp:TemplateField> 

Et dans le gestionnaire RowCommand:

void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e) 
     { 
      if (e.CommandName == "Edit") 
       Session["MID"] = Int32.Parse(e.CommandArgument.ToString()); 
     } 

Le RowCommand, bien sûr, se produit avant que la ligne passe en mode d'édition et donc avant les databinds déroulantes. Donc tout fonctionne. C'est un peu un hack, mais j'avais passé assez de temps à essayer de comprendre pourquoi la ligne d'édition n'était pas déjà databound.

2

Merci à Saurabh Tripathi,

La solution que vous travaillé pour moi à condition. Dans l'utilisation de l'événement gridView_RowDataBound().

if(gridView.EditIndex == e.Row.RowIndex && e.Row.RowType == DataControlRowType.DataRow) 
{ 
    // FindControl 
    // And populate it 
} 

Si quelqu'un est confronté au même problème, essayez-le.

Vive.

0

Ce code sera faire ce que vous voulez:

<asp:TemplateField HeaderText="garantia" SortExpression="garantia"> 
<EditItemTemplate> 
    <asp:DropDownList ID="ddgvOpp" runat="server" SelectedValue='<%# Bind("opponent.name") %>'> 
     <asp:ListItem Text="Si" Value="True"></asp:ListItem> 
     <asp:ListItem Text="No" Value="False"></asp:ListItem> 
    </asp:DropDownList> 
</EditItemTemplate> 
<ItemTemplate> 
    <asp:Label ID="Label1" runat="server" Text='<%# Bind("opponent.name") %>'></asp:Label> 
</ItemTemplate>