2008-10-05 6 views
7

Oto mój kod w GridView, który jest związany w czasie wykonywania:Jak powiązać DropDownList w GridView w polu EditItemTemplate?

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

Chcę powiązać dropdownlist „ddgvOpp”, ale nie wiem jak. Powinienem, ale nie. Oto co mam, ale wciąż otrzymuję błąd „odwołanie do obiektu”, który ma sens:

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

Gdzie BindOpponentDD() jest po prostu gdzie DropDownList zostanie wypełniona. Czy nie robię tego we właściwym momencie? Jeśli nie, które muszę umieścić?

Bardzo dziękuję z góry ...

Odpowiedz

5

Ok, chyba jestem głupi. Rozgryzłem to.

W przypadku RowDataBound, wystarczy dodać następujące warunkowy:

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

Chyba też nie trzeba (e.Row.RowType == DataControlRowType.DataRow) chyba, że ​​włamał się do edycji wierszy nagłówka w jakiś sposób. – quillbreaker

+0

Nie robisz tego, ponieważ uruchamia się w wierszu nagłówka i idzie w dół. pojawi się błąd, jeśli tego nie zrobisz lub po prostu nie działa. – Jason

+0

Lub możesz sprawdzić, czy wiersz jest w trybie edycji przez to '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"); 
    } 
} 

Spróbuj ten

Pomoże u

1

miałem ten sam problem, ale ta poprawka (Jason, który dodaje warunkowy do obsługi) nie działa dla mnie; Wiersz Edit nigdy nie był databound, więc warunek nigdy nie był oceniany jako prawdziwy. RowDataBound po prostu nigdy nie był wywoływany z tym samym obiektem RowIndex co GridView.EditIndex. Moja konfiguracja jest trochę inna, ponieważ zamiast programować programowo listę rozwijaną, mam ją powiązaną z ObjectDataSource na stronie. Lista rozwijana wciąż musi być powiązana osobno dla każdego wiersza, ponieważ jej możliwe wartości zależą od innych informacji w wierszu. Dlatego obiekt ObjectDataSource ma parametr SessionParameter i upewniam się, że ustawię odpowiednią zmienną sesji, gdy będzie to potrzebne do powiązania.

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

A rozwijana w odpowiednim rzędzie:

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

Co skończyło się robi nie używał CommandField w GridView do generowania mój edytować, usuwać, aktualizować i Cancel ; Zrobiłem to sam z TemplateField, i ustawiając odpowiednio CommandNames, byłem w stanie wyzwolić wbudowane akcje edycji/usuwania/aktualizacji/anulowania w GridView. Dla przycisku Edytuj, zrobiłem CommandArgument informacje potrzebne do powiązania listy rozwijanej, zamiast wiersza PK, jak to zwykle bywa. To na szczęście nie przeszkodziło GridView w edycji odpowiedniego wiersza.

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

I obsługi RowCommand:

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

RowCommand oczywiście zdarza się, zanim rząd przechodzi w tryb edycji, a więc przed databinds rozwijanej. Wszystko działa. To trochę hack, ale spędziłem wystarczająco dużo czasu próbując dowiedzieć się, dlaczego wiersz edycji nie był już databoundem.

2

Dzięki Saurabh Tripathi,

Rozwiązanie podałeś pracował dla mnie. W przypadku użycia zdarzenia gridView_RowDataBound().

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

Jeśli ktoś utknął z tym samym problemem, wypróbuj to.

Pozdrawiam.

0

Kod ten będzie robić to, co chcesz:

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