2010-12-04 25 views
1

J'ai un contrôle DetailsView sur les produits d'un magasin. Lorsque j'appuie sur le bouton "Modifier" du contrôle DetailsView, je veux lier un DropDownList pour lister les catégories de produits et sélectionner la catégorie de produit actuelle.La méthode DetailsViewModeChanged ne trouve pas les contrôles dans un certain mode en utilisant la méthode FindCotrol

J'utilise la méthode "ModeChanged" pour sélectionner la catégorie de produits en cours comme celui-ci:

Edit: Balisage:

<asp:DetailsView ID="dtlProduct" runat="server" 
     DataSourceID="ProductDetailsLinqDataSource" AutoGenerateRows="False" 
     DataKeyNames="ProductID"> 

     <Fields> 
      <asp:BoundField DataField="ProductName" 
       SortExpression="ProductName" /> 
      <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Label Text='<%# Eval("ProductCategory.CategoryName") %>' runat="server" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddlCategory" runat="server" DataSourceID="LDS_ProductsCategories" 
        DataTextField="CategoryName" DataValueField="CategoryID" Width="200px"> 
       </asp:DropDownList> 
       <asp:LinqDataSource ID="LDS_ProductsCategories" runat="server" 
        ContextTypeName="ProductsDataClassesDataContext" 
        Select="new (CategoryID, CategoryName)" TableName="ProductCategories"> 
       </asp:LinqDataSource> 
      </EditItemTemplate> 
      </asp:TemplateField> 
     </Fields> 
    </asp:DetailsView> 

code Derrière:

protected void dtlProduct_ModeChanged(object sender, EventArgs e) 
{ 
    if (dtlProduct.CurrentMode == DetailsViewMode.Edit) 
    { 
     ProductsDataClassesDataContext dc = new ProductsDataClassesDataContext(); 
     var categoryID = (from c in dc.Products 
        where c.ProductID == (int)dtlProduct.DataKey.Value 
        select c.ProductCategoryID).FirstOrDefault(); 

     if (categoryID != null) 
     { 
      DropDownList ddl = dtlProduct.FindControl("ddlCategory") as DropDownList; 
      ddl.Items.FindByValue(categoryID.ToString()).Selected = true; 
     } 
    } 
} 

la méthode FindControl qui ne fonctionne pas trouver le "ddlCategory" (renvoie null) bien qu'il soit présent dans le EditTemplateField.

Je ne sais pas ce qui ne va pas!

Je pense à utiliser l'événement "DropDownList's PreRender" pour faire le but que je vise, mais je veux savoir ce qui ne va pas!

Un grand merci ....

Répondre

1

Il semble que vous devez trouver votre conteneur d'édition en premier. En regardant votre question, si je comprends bien, je suggère d'utiliser l'événement Databound et de lier la liste déroulante là.

Vérifiez ce lien: http://weblogs.asp.net/sukumarraju/archive/2009/11/22/binding-drop-down-list-control-when-details-view-is-in-edit-mode.aspx

Je suis aussi penser que vous devez déplacer votre productcategeories DataSource

<asp:LinqDataSource ID="LDS_ProductsCategories" runat="server" 
        ContextTypeName="ProductsDataClassesDataContext" 
        Select="new (CategoryID, CategoryName)" TableName="ProductCategories"> 
       </asp:LinqDataSource> 

à l'extérieur du modèle d'édition (il peut exister en dehors de la detailsview).

+0

Merci, comment puis-je trouver le conteneur d'édition? J'ai ajouté le balisage asp.net, pourriez-vous me guider? –