Не удалось найти элемент управления в ControlParameter внутри EditItemTemplate

Я работаю над сайтом Dynamic Data, и я столкнулся с стеной. У меня есть страница с подробной информацией о деталях для каждого сотрудника, и у меня есть отдельная страница для редактирования каждого сотрудника. Я сделал это, потому что мне нужно использовать коробки 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.

Вот ошибка, которую я получаю:

Не удалось найти элемент управления 'ddlDept' в ControlParameter 'DeptID'.

Я правильно понимаю, что он не может получить доступ к идентификатору ddlDept по этому идентификатору, потому что он находится в EditItemTemplate? Как я могу это исправить? Другие предложения о том, как достичь этого? Любая помощь приветствуется.

Ответ 1

Я нашел, что эта ссылка помогает решить без серверной стороны: Решение ошибки" Не удалось найти элемент управления xxx в ControlParameter 'xxx'.

автор говорит, что вы можете использовать доллар char ($) для доступа к внутреннему элементу управления.

Пример:

ControlID="dvEmployee$ddlDept"

получит значение ddlDept, являющееся внутренним контролем dvEmployee

Ответ 2

Ваше предположение верно; <ControlParameter > не распознает ваш ddlDept, потому что он находится в другом ContentTemplate.

Один из способов обойти это - удалить <ControlParameter> из вашей разметки и добавить его программно во время выполнения, чтобы вы могли использовать фактическое свойство UniqueID ddlDept.

Что-то вроде этого:

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

Ответ 3

Один из способов, с помощью которого я нашел проблему с объектами источников данных, ищущими элементы управления внутри контекста элемента управления DetailsView или GridView, - это фактически разместить элемент управления источником данных внутри шаблона элемента/редактирования, в котором есть элементы управления, которые вы хочу ссылаться. Это может быть не идеально для всех ситуаций, но это, безусловно, работает.

Ответ 4

Другой вариант: установите режим идентификатора клиента dropdownlist как статический. Тогда ваш идентификатор dropdownlist не будет изменен.

 ClientIDMode="Static"

Спасибо,

Эсен.

Ответ 5

Убедитесь, что ваш контроль интересов имеет runat = "server". Argh.