DetailsView_ModeChanged方法使用FindCotrol方法找不到特定模式下的控件

时间:2010-12-04 14:37:14

标签: asp.net data-binding detailsview

我有一个关于商店产品的DetailsView控件。

当我点击DetailsView控件的“编辑”按钮时,我想绑定DropDownList以列出产品类别并选择其中的当前产品类别。

我使用方法“ModeChanged”来选择当前的产品类别:

编辑:加价:

<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方法虽然它出现在EditTemplateField中,却找不到“ddlCategory”(返回null)。

我不知道出了什么问题!

我正在考虑使用“DropDownList的PreRender”活动来实现我的目标,但我想知道出了什么问题!

非常感谢....

1 个答案:

答案 0 :(得分: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之外)。