2008-10-05 3 views
7

Hier ist mein Code in einer Gridview, die zur Laufzeit gebunden ist:Wie binden Sie eine DropDownList in einer GridView im EditItemTemplate-Feld?

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

Ich will das Dropdownlist „ddgvOpp“ binden, aber ich weiß nicht, wie. Ich sollte, aber ich nicht. Hier ist, was ich habe, aber ich erhalte einen „Objektverweis“ Fehler bekommen, was Sinn macht:

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

Wo BindOpponentDD() gerade ist, wo die Dropdownlist bevölkert wird. Tue ich das nicht in der richtigen Veranstaltung? Wenn nicht, wofür brauche ich es?

Vielen Dank im Voraus ...

Antwort

5

Ok, ich denke, ich bin nur stumm. Ich habe es herausgefunden.

Im RowDataBound Ereignis, fügen Sie einfach die folgende Bedingung:

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

Ich glaube, Sie brauchen auch nicht (e.Row.RowType == DataControlRowType.DataRow), wenn Sie editierbare Kopfzeilen in irgendwie gehackt haben. – quillbreaker

+0

Nein, weil es beginnt mit der Kopfzeile und arbeitet sich nach unten. Sie erhalten einen Fehler, wenn Sie dies nicht tun, oder es funktioniert einfach nicht. – Jason

+0

Oder Sie können überprüfen, ob sich die Zeile im Bearbeitungsmodus befindet, indem Sie '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"); 
    } 
} 

Versuchen Sie dieses

Dies wird u

1

Ich hatte das gleiche Problem helfen, aber dieses Update (Jasons, der dem Handler die Bedingung hinzufügt) funktionierte nicht für mich; Die Zeile "Bearbeiten" wurde nie mit Daten verknüpft, sodass diese Bedingung nie als "wahr" bewertet wurde. RowDataBound wurde einfach nie mit demselben RowIndex wie der GridView.EditIndex aufgerufen. Mein Setup ist ein wenig anders, da ich das Dropdown-Programm nicht programmatisch an eine ObjectDataSource auf der Seite gebunden habe. Das Dropdown muss jedoch immer noch separat pro Zeile gebunden werden, da seine möglichen Werte von anderen Informationen in der Zeile abhängen. Also hat die ObjectDataSource einen SessionParameter, und ich stelle sicher, dass die passende Session-Variable gesetzt wird, wenn sie zum Binden benötigt wird.

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

Und das Drop-Down in der entsprechenden Zeile:

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

Was ich am Ende tun war kein Command im Gridview mit meinem bearbeiten zu erzeugen, löschen, aktualisieren und Abbrechen Schaltflächen ; Ich habe es selbst mit einem TemplateField gemacht und durch entsprechende Einstellung der CommandNames konnte ich die integrierten Edit/Delete/Update/Cancel Aktionen auf dem GridView auslösen. Für die Schaltfläche "Bearbeiten" habe ich CommandArgument die Informationen erstellt, die ich zum Binden der Dropdown-Liste benötigte, anstelle der PK der Zeile, wie es normalerweise der Fall wäre. Dies verhinderte glücklicherweise nicht, dass GridView die entsprechende Zeile editierte.

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

Und in dem RowCommand Handler:

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

Der RowCommand, natürlich geschieht, bevor die Zeile in Modus bearbeiten geht und somit vor dem Drop-Down-databinds. So funktioniert alles. Es ist ein bisschen wie ein Hack, aber ich hatte genug Zeit damit verbracht herauszufinden, warum die Editierzeile nicht bereits datengebunden war.

2

Dank Saurabh Tripathi,

Die Lösung, die Sie für mich gearbeitet bereitgestellt. In gridView_RowDataBound() Ereignis verwenden.

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

Wenn jemand mit dem gleichen Problem festgefahren ist, dann probieren Sie es aus.

Prost.

0

Dieser Code wird das tun, was Sie wollen:

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