我正在开发动态数据网站,但我遇到了困境。我有一个详细信息页面,其中可以看到每个员工的详细信息,然后我有一个单独的页面来编辑每个员工。我这样做是因为我需要在每个部门使用部门和工作的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。这是我想要使用的DataSource。
<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中?我怎样才能解决这个问题?关于如何实现这一目标的其他建议?非常感谢任何和所有帮助。
答案 0 :(得分:18)
我发现此链接有助于在没有服务器端的情况下解决:Solving the error "Could not find control 'xxx' in ControlParameter 'xxx'."
作者说您可以使用美元字符( $ )来访问内部控件。
前:
ControlID="dvEmployee$ddlDept"
将获取ddlDept的值,该值是dvEmployee的内部控件
答案 1 :(得分:3)
你的假设是正确的; <ControlParameter
&gt;无法识别您的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);
}
}
答案 2 :(得分:3)
我发现解决此问题的一种方法是使用数据源对象在DetailsView或GridView控件的上下文中查找控件,实际上是将数据源控件放在具有控件的项/编辑项模板中希望参考。这可能不适合所有情况,但肯定有效。
答案 3 :(得分:2)
另一个选择是,将您的下拉列表客户端ID模式设置为静态。然后您的下拉列表ID将不会被修改。
ClientIDMode="Static"
谢谢,
也先。
答案 4 :(得分:0)
确保您的兴趣控制权限为runat =“server”。哎呀。
答案 5 :(得分:0)
如果你谈论gridview(添加新的记录按钮) 使用
<asp:Parameter Name="Type" Type="String"/>
而不是
<asp:ControlParameter Name="Type" ControlID="rddType" PropertyName="SelectedValue" />