2008-10-05 17 views
7

Aquí está mi código en un gridview que está enlazado en tiempo de ejecución:¿Cómo se vincula una DropDownList en un GridView en el campo EditItemTemplate?

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

quiero obligar a la lista desplegable "ddgvOpp" pero no saben cómo. Debería, pero no lo hago. Aquí es lo que tengo, pero sigo obteniendo un error "Referencia a objeto", lo cual tiene sentido:

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

Dónde BindOpponentDD() es justo donde el DropDownList se rellena. ¿No estoy haciendo esto en el evento correcto? Si no, ¿en qué debo ponerlo?

Muchas gracias de antemano ...

Respuesta

5

bien, supongo que soy simplemente tonto. Me lo imaginé.

En el caso RowDataBound, sólo tiene que añadir el siguiente condicional:

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

Creo que también no es necesario (e.Row.RowType == DataControlRowType.DataRow) a menos que haya hackeado filas de encabezado editables en alguna manera. – quillbreaker

+0

no lo haces porque comienza con la fila del encabezado y funciona hacia abajo. se obtiene un error si no lo hace, o simplemente no funciona. – Jason

+0

O puede verificar si la fila está en el modo de edición con este '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"); 
    } 
} 

prueba este

Esto ayudará u

1

que tenía el mismo problema, pero esta revisión (Jason's, que está agregando el condicional al manejador) no funcionó para mí; la fila Editar nunca estuvo unida a datos, por lo que esa condición nunca se evaluó como verdadera. RowDataBound simplemente nunca se llamó con el mismo RowIndex que el GridView.EditIndex. Mi configuración es un poco diferente, sin embargo, en lugar de vincular el menú desplegable programáticamente, lo tengo vinculado a un ObjectDataSource en la página. Sin embargo, el menú desplegable aún debe vincularse por fila por separado, porque sus posibles valores dependen de otra información en la fila. Así que ObjectDataSource tiene un parámetro de sesión, y me aseguro de establecer la variable de sesión apropiada cuando sea necesario para el enlace.

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

Y el menú desplegable en la fila correspondiente:

<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> 

Lo que terminé haciendo no estaba usando un CommandField en el GridView para generar mi editar, borrar, actualizar y cancelar los botones ; Lo hice solo con un TemplateField, y al configurar los CommandNames adecuadamente, pude desencadenar las acciones integradas de edición/eliminación/actualización/cancelación en el GridView. Para el botón Editar, hice del CommandArgument la información que necesitaba para enlazar el menú desplegable, en lugar de la PK de la fila como solía ser. Esto afortunadamente no evitó que GridView editara la fila apropiada.

<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> 

Y en el controlador RowCommand:

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

El RowCommand, por supuesto, sucede antes de la fila entra en el modo de edición y por lo tanto antes de que los databinds desplegables. Entonces todo funciona. Es un poco complicado, pero había pasado el tiempo suficiente tratando de descubrir por qué la fila de edición ya no estaba siendo databound.

2

Gracias a Saurabh Tripathi,

La solución que ya ha proporcionado trabajó para mí. En uso de evento gridView_RowDataBound().

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

Si alguien tiene el mismo problema, pruebe esto.

Saludos.

0

Este código se hace lo que quiere:

<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> 
Cuestiones relacionadas