2012-05-21 40 views
11

Estoy trabajando en un sitio web de Dynamic Data y me he topado con un muro. Tengo una página de Detalles donde se pueden ver los detalles de cada empleado, y luego tengo una página separada para editar cada empleado. Hice esto porque necesito usar cuadros DropDownList para Departamento y Trabajo en cada departamento. Sin embargo, tengo problemas para acceder al ddl del departamento y creo que es porque está dentro de EditItemTemplate. Aquí es lo que tengo:No se pudo encontrar Control en ControlParameter dentro de 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> 

entonces estoy tratando de utilizar el ddlDept SelectedValue para poblar el ddlJob. Aquí está el DataSource que intento usar.

<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> 

sé que el formato del parámetro Select es correcta porque estoy utilizando otra DDL para poblar el DetailsView y sé la relación entre Departamentos y JobCodes es correcta, porque lo estoy usando con éxito en la página AddEmployee.

Aquí está el error que consigo:

No se pudo encontrar el control 'ddlDept' en 'DeptID' ControlParameter.

¿Estoy en lo cierto al suponer que no puede acceder al ddlDept por su ID porque está en EditItemTemplate? ¿Cómo puedo arreglar esto? Otras sugerencias sobre cómo lograr esto? Cualquier y toda ayuda es muy apreciada.

+0

Compruebe si [esto] (http://geekswithblogs.net/AzamSharp/archive/2006/08/27/89475.aspx) ayuda. No es una solución ideal, pero podría funcionar para usted. –

Respuesta

3

Su suposición es correcta; <ControlParameter> no reconoce su ddlDept porque está en un ContentTemplate diferente.

Una forma de evitar esto es eliminar <ControlParameter> de su marcado y agregarlo programáticamente en tiempo de ejecución, para que pueda usar la propiedad actual de ddlDept UniqueID.

Algo como esto:

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

Si no tiene acceso al código del lado del servidor, esto se cae. ¿Cómo podría uno abordar este lado del cliente? –

+0

Hola, @CodeMaverick: la [respuesta más votados] (https://stackoverflow.com/a/11653516/861565) en esta pregunta tiene una buena solución que sé que funciona si tienes acceso al marcado. Si se refiere al lado del cliente como en JavaScript, puede que tenga que ser un poco más creativo. El ID generado por el servidor para las listas desplegables contendrá la ID del lado del servidor, por lo que podría usar el ["atributo contiene selector"] (https://api.jquery.com/attribute-contains-selector/) para obtener todas las desplegables, y luego iterar a través de ellos, estableciendo el valor seleccionado correcto basado en el contexto (controles de hermanos, etc.). – jadarnel27

16

me encontré con este enlace ayuda a resolver sin lado del servidor: Solving the error "Could not find control 'xxx' in ControlParameter 'xxx'."

el autor dice que se puede utilizar el carbón dólar ($) para acceder al interior controlar.

Ex:

ControlID="dvEmployee$ddlDept"

obtendrá el valor de ddlDept que es un control interno de dvEmployee

+0

Gracias por compartir la solución. Funciona. – Tops

+0

Esta es una gran solución. Exactamente lo que buscaba. –

+0

Esto solo funciona si el DOM puede verlo. De lo contrario, es el mismo problema – Fandango68

2

Otra opción es, configure el modo de lista desplegable ID de cliente a ser estática. Entonces su ID de lista desplegable no se modificará.

ClientIDMode="Static" 

Gracias,

Esen.

3

Una forma de evitar este problema con los objetos fuente de datos en busca de controles dentro del contexto de un control DetailsView o GridView es colocar realmente el control de fuente de datos dentro del elemento/editar plantilla de elemento que tiene los controles quieres hacer referencia Esto puede no ser ideal para todas las situaciones, pero ciertamente funciona.

+0

Funcionó mejor en mi situación: Un DetailsView (dv) con DropDownList (ddl) que está vinculado a un segundo origen de datos (s2) que requiere ddl.SelectedValue como parámetro de selección. Si s2 se colocó fuera de dv y dv NO es visible (sucede en mi código), s2 aún intentará acceder a ddl y suceden cosas extrañas. – Tobias81

0

Asegúrate de que tu control de interés tiene runat = "server". Argh.

Cuestiones relacionadas