12

我在一个动态数据网站上工作,我遇到了墙。我有一个详细信息页面,可以看到每个员工的详细信息,然后我有一个单独的页面来编辑每个员工。我这样做是因为我需要在每个部门中为 Department 和 Job 使用 DropDownList 框。尽管如此,我在访问部门 ddl 时遇到问题,我认为这是因为它位于 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 中?我怎样才能解决这个问题?关于如何实现这一目标的其他建议?非常感谢任何和所有帮助。

4

6 回答 6

19

我发现此链接有助于在没有服务器端的情况下解决:解决错误“在 ControlParameter 'xxx' 中找不到控件 'xxx'。”

作者说您可以使用美元字符($)来访问内部控件。

前任:

ControlID="dvEmployee$ddlDept"

将获得 ddlDept 的值,它是 dvEmployee 的内部控件

于 2012-07-25T15:40:41.780 回答
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);
    }
}
于 2012-05-21T15:44:39.770 回答
3

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

于 2015-06-28T02:55:02.277 回答
2

另一种选择是将下拉列表客户端 ID 模式设置为静态。那么您的下拉列表 id 将不会被修改。

 ClientIDMode="Static"

谢谢,

埃森。

于 2012-12-13T18:24:16.703 回答
0

确保您的利益控制具有 runat="server"。啊。

于 2017-07-10T19:06:24.257 回答
0

如果您谈论 gridview(添加新记录按钮),请使用

    <asp:Parameter Name="Type" Type="String"/> 

代替

    <asp:ControlParameter    Name="Type"    ControlID="rddType"   PropertyName="SelectedValue" />
于 2018-04-02T07:41:35.950 回答