Tengo una clase que contiene los datos jerárquicos. Quiero presentar esta información en mi ASP.net webapp anidada utilizando repetidores. ¿Cómo puedo hacer esto? Sólo he hecho un nivel de anidamiento, ¿cómo puedo decir cinco niveles?

Cada elemento puede tener cero o varios subtemas. Estoy básicamente de sangría en cada subleveling el uso de un poco de css cosas. No quiero utilizar el control treeview, quiero estrictamente palo con un repetidor.

Actualización:

Mis datos proviene de una base de datos. Me tiene un objeto datatable con algunas propiedades básicas.

Item
{
   ID,
   Name,
   Description,
   ...
}

Entonces tengo muchos a muchos tabla con:

Parent
{
   ParentID,
   ChildID
}

Estoy iterar a través de cada elemento y la visualización de sus hijos; y sus hijos. Supongo que esto podría lograrse mejor con anidada de los repetidores, pero puedo estar equivocado.

  • ¿Qué tipo de datos están mostrando? tabular los datos? listas? de dónde proceden los datos? (usted puede terminar con los problemas de muchos selecciona si usted está recibiendo de la base de datos ya que recibirás un enlace para cada repetidor)
  • Enviar los datos de muestra de sus repetidores se muestran.
  • No entiendo la edición que se hizo. Mientras yo no puedo pensar en nada específico en 4.0 que afectan a este, (A) podría estar equivocado, (B) ¿cómo es la querant destinados a conocer, si lo hiciera no estaría haciendo esta pregunta.
  • Los datos es básicamente texto, y se trata de una base de datos. Acabo de incluir lo que la versión de cosas de las que estoy utilizando, de manera que las soluciones pueden ser presentados de que el objetivo de mi entorno.
  • lo mejor es preguntar sobre lo que no entiendan, no sea que permanecer en la ignorancia. La información que he quitado el título i ya en las etiquetas. Es redundante en el título. También, C# es totalmente irrelevante para esta pregunta. La respuesta sería idéntico si Mike estaban utilizando VB.NET con la excepción de un poco de sintaxis. Por último, «Hola», «Gracias», las firmas y los lemas son el ruido y no pertenecen en un Q&a Un sitio. Tal vez en un foro de discusión, que esto no es.
  • Aquí el bonito artículo sobre anidada repetidor de control para mostrar datos jerárquicos goo.gl/I37Nuj

InformationsquelleAutor Mike | 2010-08-26

4 Comentarios

  1. 34

    Siempre limpiador para lidiar con el origen de datos que se preocupe por ItemDataBound, pero esto es aún más el caso cuando la anidación de Repetidores:

    <asp:Repeater DataSource="<%#ColOfCol%>" runat="server">
      <ItemTemplate>
        <tr>
          <asp:Repeater DataSource="<%#Container.DataItem%>" runat="server">
            <ItemTemplate>
              <td><%#SomeExtractingMethodLikeEval()%></td>
            </ItemTemplate>
          </asp:Repeater>
        </tr>
      </ItemTemplate>
    </asp:Repeater>

    El interior de origen de datos también podría ser una cotizacion de la propiedad, o una llamada a un método que devuelve la enumeración quería. Acaba de ser conscientes de que va a ser llamado con un objeto. Yo prefiero escribir la versión específica y, a continuación, sobrecarga:

    protected IEnumerable<string> GetNames(Family fam)
    {
      foreach(Person p in fam.Members)
        yield return p.FirstName + " " + p.Surname;
    }
    protected IEnumerable<string> GetNames(object famObj)
    {
        return GetNames((Family)famObj);
    }

    Una cosa a tener en cuenta es que si usted desea conseguir el objeto actual en la matriz del repetidor de lo que usted tiene que obtener con:

    ((RepeaterItem)Container.Parent.Parent).DataItem
    • Esta es una cuestión de preferencia. No me gusta la incrustación de la lógica de enlace en aspx y, a continuación, sigue teniendo que recurrir a código subyacente para nada de la complejidad.
    • protegido IEnumerable<cadena> GetNames(objeto famObj) cualquier particular para el parámetro de la función del nombre?
    • no, por alguna razón, la plena obtención de los nombres de un grupo de personas en una familia fue el ejemplo que se me ocurrió usar, aunque yo no puedo pensar por qué. Tal vez se relacione con algo que yo estaba trabajando de verdad en el tiempo, o algo que ocurrió en otra pregunta aquí en el tiempo.
  2. 80

    He encontrado que la manera más sencilla de hacer anidada repetidores sin preocuparse de enlace de datos de eventos es que se acaba de establecer el origen de datos utilizando <%# %> sintaxis.

    Por ejemplo:

    <asp:Repeater runat="server" id="Departments">
      <ItemTemplate>
        Name: <%# Eval("DeptName") %>
        Employees:
        <asp:Repeater runat="server" DataSource='<%# Eval("Employees") %>'>
          <ItemTemplate><%# Eval("Name") %></ItemTemplate>
          <SeparatorTemplate>,</SeparatorTemplate>
        </asp:Repeater>
      </ItemTemplate>
    </asp:Repeater>

    Esto es suponiendo que los Departamentos de la clase tiene un empleado de la propiedad – por ejemplo:

    public class Department {
      public string DeptName {get; set;}
      public IEnumerable<Employee> Employees {get; set;}
    }
    public class Employee {
      public string Name {get; set;}
    }

    Si su exterior-repetidor objeto no tiene una propiedad que corresponde al interior de la repetidor objeto puede utilizar este truco, mediante la adición de un método en el código subyacente que hace el cálculo. Por lo que su interior repetidor podría ser:

    <asp:Repeater runat="server" DataSource='<%# GetEmployees(Container.DataItem) %>'>

    y, a continuación, GetEmployees podría ser algo como:

    protected IEnumerable<Employee> GetEmployees(object item) {
      var dept = (Department) item;
      //then do whatever is necessary to get the employees from dept
      return employees;
    }
    • Por favor, rellene este ejemplo mostrando lo que los datos parecen. En particular, ¿cuál es en los «Empleados» de la propiedad?
    • es claramente una enumeración de algún tipo de objeto que tiene un Nombre de propiedad.
    • duh. de verdad? Es claro para mí, pero tal vez no a los próximos mil personas que lean esta respuesta.
    • Hecho. También he añadido una nota sobre cómo manejar el caso en que el Departamento no dispone de Empleados de la propiedad.
    • Alguna idea de por qué me sale el error de «Enlace de datos: ‘espacio de Nombres.Miarchivo’ no contiene una propiedad con el nombre de «Nombre». cuando se tiene una propiedad llamada «Nombre» y es público?
    • Ah no me getters y setters en mis campos de objeto.
    • Gran respuesta. He estado buscando algo limpio y simple como esto durante tanto tiempo!
    • En la posibilidad de que has tratado de envolver el origen de datos de valor en «comillas dobles» y el ejemplo de arriba no funciona, pues bien, el uso de ‘comillas simples’ como en el ejemplo.

  3. 11

    Puede anidar repetidores sin un problema. Más de 2 niveles de profundidad se pone cachondo, aunque. He aquí cómo:

    El html se ve algo como esto:

    <asp:Repeater ID="r1" runat="server" OnItemDataBound="r1_ItemDataBound">
    <ItemTemplate>
    <!-- top level repeater element template here -->
        <asp:Repeater ID="r2" runat="server" onitemdatabound="r2_ItemDataBound">
        <ItemTemplate>
    <!-- child repeater element template here -->
        </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
    </asp:Repeater>

    El código subyacente se parece a esto:

        protected void r1_ItemDataBound(object sender, RepeaterItemEventArgs e) {
            Repeater r2 = (Repeater)e.Item.FindControl("r2");
            r2.DataSource = yourDataSourceHere; //you'll have to query for appropriate data
            r2.DataBind();
        }
    
        protected void r2_ItemDataBound(object sender, RepeaterItemEventArgs e) {
            //do the same thing here for the 3rd nested repeater if you have a third, and so on
        }
    • Se pone desagradable, pero su lo que es más desagradable con la huelga itemdatabound controladores en lugar de usar simplemente origen de datos.
    • respondió a su comentario abajo; me parece que mi enfoque más extensible y menos feo para más complejos de unión de la lógica; por ejemplo, cuando un filtro para el contexto de seguridad actual se requiere, además de los padres contexto.
    • Sí, cuando usted tiene que proporcionar la lógica para el enlace de datos de cada elemento, a continuación, itemdatabound tiene su valor. Cuando usted va a través de objetos anidados aunque, no veo cuál es la complejidad extra dividido en tantos lugares diferentes y obligando a cambiar los modos de pensamiento (con el sólo aspx manera en que uno puede seguir pensando «esto es un montón de cosas en las que estoy pasando» en lugar de considerar cuando los controles de recepción de su enlace de llamada) las ganancias.
    • En una enorme base de que a veces requiere el código-detrás de patrón, he encontrado que es útil usar el mismo patrón, incluso en casos triviales. Es bastante fácil encontrar el enlace de datos lógica, y puede ser extendida sin invertir tiempo en el cambio de los patrones.
  4. 2
    <asp:Repeater ID="R1" runat="server">
        <ItemTemplate>
            <asp:Repeater ID="R2" runat="server">
            </asp:Repeater>
        </ItemTemplate>
    </asp:Repeater>
    
    
    R1.ItemDataBound += (s, e) =>
    {
        var r2 = e.Item.FindControl("R2") as Repeater;
        r2.DataSource = something;
        r2.DataBind();
    };

    Ser conscientes de que FindControl no es recursiva, sólo se pondrá a los niños.

Dejar respuesta

Please enter your comment!
Please enter your name here