在 EditItemTemplate 中的 ControlParameter 中找不到 Control。

13
我正在开发一个动态数据网站,但遇到了问题。我有一个详细信息页面,可以查看每个员工的详细信息,然后我有一个单独的页面来编辑每个员工。我这样做是因为我需要在每个部门中使用DropDownList框来选择部门和工作。然而,我无法访问部门下拉列表并且我认为这是因为它位于EditItemTemplate内部。这是我的代码:
<asp:DetailsView ID="dvEmployee" 
                    DataSourceID="EmpDVds" 
                    AutoGenerateRows="false" 
                    DataKeyNames="Id" 
                    GridLines="None" 
                    CellSpacing="10" 
                    runat="server" DefaultMode="Edit">
                    <Fields>
                        <asp:TemplateField HeaderStyle-Font-Bold="true" HeaderText="Department: ">
                            <EditItemTemplate>
                                <asp:DropDownList ID="ddlDept" DataSourceID="DeptDDLds" DataTextField = "DepartmentName" DataValueField = "Id" runat="server" SelectedValue='<%#Bind("DeptID") %>' />
                            </EditItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderStyle-Font-Bold="true" HeaderText="Job Code: ">
                            <EditItemTemplate>
                                <asp:DropDownList ID="ddlJob" DataSourceID="JobDDLds" DataTextField = "JobName" DataValueField = "Id" runat="server" />
                            </EditItemTemplate>
                        </asp:TemplateField>
                    </Fields>

然后我尝试使用ddlDept的SelectedValue来填充ddlJob。这是我尝试使用的数据源。

<asp:SqlDataSource ID="JobDDLds"
                    SelectCommand="
                        SELECT 
                        Id, 
                        Code+' - '+[Desc] AS JobName,
                        Department_Id 
                        FROM 
                        JobCodes 
                        WHERE
                        JobCodes.Department_Id = @DeptID"
                    ConnectionString="<%$ConnectionStrings:TrainingDatabaseConnection %>" runat="server" >
                        <SelectParameters>
                            <asp:ControlParameter ControlID="ddlDept" PropertyName="SelectedValue"
                                    Name="DeptID" Type="Int32" />
                        </SelectParameters>
                    </asp:SqlDataSource>

我知道Select参数的格式是正确的,因为我正在使用另一个ddl来填充DetailsView,并且我知道Departments和JobCodes之间的关系是正确的,因为我在AddEmployee页面中成功使用它。

以下是我收到的错误信息:

在 ControlParameter 'DeptID' 中找不到控件'ddlDept'。

我是否正确地假设它无法通过它的ID访问ddlDept,因为它在EditItemTemplate中?我该如何解决这个问题?还有其他实现此目标的建议吗?非常感谢任何帮助。


请检查此链接是否有所帮助:http://geekswithblogs.net/AzamSharp/archive/2006/08/27/89475.aspx。虽然不是理想的解决方案,但可能适用于您。 - Claudio Redi
6个回答

19

这是一个很棒的解决方案。正是我想要的。 - Darren
只有在 DOM 可见时才能起作用,否则就是同样的问题。 - Fandango68

4
您的假设是正确的;<ControlParameter>无法识别您的ddlDept,因为它在不同的ContentTemplate中。
解决此问题的一种方法是从标记中删除<ControlParameter>,并在运行时以编程方式添加它,以便您可以使用ddlDept的实际UniqueID属性。
像这样:
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // Create your ControlParameter
        ControlParameter deptParam = new ControlParameter();
        deptParam.ControlID = ddlDept.UniqueID;
        deptParam.PropertyName = "SelectedValue";
        deptParam.Name = "DeptID";
        deptParam.Type = TypeCode.Int32;
        // Add it to your SelectParameters collection
        JobDDLds.SelectParameters.Add(deptParam);
    }
}

如果您无法访问服务器端代码,则此方案行不通。那么,客户端该如何处理呢? - Code Maverick
嘿,@CodeMaverick - 该问题的得票最高答案有一个好的解决方法,我知道它适用于如果您可以访问标记。 如果您指的是客户端JavaScript,那么您可能需要更有创意一些。 下拉列表的服务器生成ID将包含服务器端ID,因此您可以使用"属性包含选择器"来获取所有下拉列表,然后迭代它们,根据上下文(同级控件等)设置正确的选定值。 - Josh Darnell

3

我发现解决数据源对象在查找DetailsView或GridView控件上下文中的控件时出现的问题的一种方法是将数据源控件实际放置在具有您希望引用的控件的项目/编辑项模板内部。虽然这种方法可能并非适用于所有情况,但它确实有效。


在我的情况下,最好的解决方案是:使用一个绑定到第二个数据源(s2)的DropDownList(ddl),该数据源需要ddl.SelectedValue作为选择参数的DetailsView(dv)。如果s2放置在dv之外且dv不可见(在我的代码中发生),s2仍将尝试访问ddl,会发生奇怪的事情。 - Tobias81

2
另一个选择是将下拉列表的客户端ID模式设置为静态。这样,下拉列表的ID就不会被修改。
 ClientIDMode="Static"

感谢您,Esen。

0
如果你在谈论GridView(添加新记录按钮),请使用:
    <asp:Parameter Name="Type" Type="String"/> 

而不是

    <asp:ControlParameter    Name="Type"    ControlID="rddType"   PropertyName="SelectedValue" />

0

请确保您感兴趣的控件具有 runat="server" 属性。唉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接