2010-12-04 1 views
1

상점 제품에 대한 DetailsView 컨트롤이 있습니다.DetailsView_ModeChanged 메서드는 FindCotrol 메서드를 사용하여 특정 모드에서 컨트롤을 찾지 못합니다.

DetailsView 컨트롤의 "편집"단추를 누르면 DropDownList를 바인딩하여 제품 범주를 나열하고 그 안에 현재 제품 범주를 선택합니다.

편집 : 마크 업 : 뒤에

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

코드 :

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

FindControl 메서드는하지 않습니다

는이 같은 현재 제품 범주를 선택하는 방법 "ModeChanged"를 사용 EditTemplateField에 있지만 "ddlCategory"(null을 반환)를 찾습니다.

나는 무엇이 잘못 될 지 모른다.

내가 목표로하는 목적으로 "DropDownList 's PreRender"이벤트를 사용하려고 생각하지만, 무엇이 잘못되었는지 알고 싶습니다!

많은 감사합니다 ....

답변

1

편집 컨테이너를 먼저 찾아야하는 것 같습니다. 귀하의 질문을보고, 내가 올바르게 이해할 경우 - 나는 Databound 이벤트를 사용하고 거기에 드롭 다운 목록을 바인딩 할 것을 제안 할 수 있습니다.

체크 아웃 링크 : http://weblogs.asp.net/sukumarraju/archive/2009/11/22/binding-drop-down-list-control-when-details-view-is-in-edit-mode.aspx

나는 또한 당신이 당신의 productcategeories 데이터 소스를 이동해야합니다 생각하고 있어요 :

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

편집 템플릿의 외부를 (그것을 위해 DetailsView의 외부에 존재할 수 있습니다).

+0

감사합니다. 편집 컨테이너는 어떻게 찾을 수 있습니까? asp.net 마크 업을 추가했습니다. 안내 할 수 있습니까? –