как показать список материнской компании и дочерних компаний с флажком для выбора в веб-форме asp.net с использованием вложенных повторителей

Таблица компаний на сервере SQL с использованием веб-форм asp.net для отображения всего списка компаний, сначала с материнской компанией и дочерними компаниями в материнской компании, со списком флажков для выбора компаний. В 1-м SQL SP я получаю список родительских компаний в Datatable и идентификатор этой компании из первой таблицы данных (например: 1,2,3), чтобы получить список дочерних компаний во второй DataTable.

Я пытался использовать вложенный повторитель для двух таблиц данных и не знаю, как этого добиться и какой из них лучше всего подходит для управления.

    protected void Page_Load(object sender, EventArgs e)
    {

        if (!Page.IsPostBack)
        {
            DataTable dtx = Getparentfirm();
            DataTable dso = GetSuboffice(dtx);
            R1.DataSource = dtx;
            R1.DataBind();
            R2.DataSource = dso;
            R2.DataBind();
        }

    }

    private DataTable Getparentfirm()
    {
        using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True"))
        {
            SqlDataAdapter sda = new SqlDataAdapter("select * from company where parentcompany is NULL", conn);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            return dt;
        }

    }
    private DataTable GetSuboffice(DataTable dt)
    {
        DataTable dtz = new DataTable();
        using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True"))
            foreach (DataRow row in dt.Rows)
            {                           
            SqlDataAdapter sda = new SqlDataAdapter("select  id, fname , lname from customer where cid =" + row["cid"].ToString(), conn);                           
            sda.Fill(dtz);
            return dtz;
        }
        return null;
    }

       <asp:Repeater ID="R1" runat="server">
            <ItemTemplate>
                    name:<%# Eval("companyname") %></td>
            </ItemTemplate>
            <asp:Repeater ID="R2" runat="server">
                    <ItemTemplate>
                        ID :<%# Eval("companyid") %>
                        Name:<%# Eval("companyname") %>

                </ItemTemplate>
            </asp:Repeater>
        </asp:Repeater>

Как привязать 2 таблицы данных к вложенным повторителям, чтобы получить ожидаемый результат. Любая помощь будет отличной

ожидаемый ВЫВОД

      parentcompanyid 1     parent company one          checkbox
        sub office 1.1        sub office one            checkbox
        sub office 1.2        sub office two            checkbox
      parent comapnyid 2    parent company two          checkbox 
         sub office 2.1        sub office one           checkbox
        sub office 2.2        sub office two            checkbox

person Jim Lobo    schedule 16.01.2019    source источник


Ответы (1)


Когда вы используете повторитель, убедитесь, что весь ваш контент находится в узле шаблона, например <ItemTemplate>, даже во вложенном повторителе.

Как только разметка будет правильной, вы можете прикрепить событие OnItemDataBound к родительскому повторителю, затем использовать идентификатор этого элемента, чтобы получить данные для привязки вложенного повторителя, а затем просто привязать его. Например, вот так:

ASPX

        <asp:Repeater ID="R1" runat="server" OnItemDataBound="R1_ItemDataBound">
            <ItemTemplate>
                  <asp:HiddenField runat="server" ID="CompanyId" value='<%# Eval("id") %>' />
                  <div>name:<%# Eval("companyname") %></div>

                  <asp:Repeater ID="R2" runat="server">
                    <ItemTemplate>
                        ID :<%# Eval("companyid") %><br>
                        Name:<%# Eval("companyname") %>
                    </ItemTemplate>
                  </asp:Repeater>
            </ItemTemplate>                
        </asp:Repeater>

CS

    protected void Page_Load(object sender, EventArgs e)
    {   
        if (!Page.IsPostBack)
        {
            DataTable dtx = Getparentfirm();
            R1.DataSource = dtx;
            R1.DataBind();
        }  
    }    

    protected void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
          // Get companyId from hidden field 
          // or you could get it from e.Item.DataItem which should have the data for this row of data
          var CompanyID = (HiddenField)e.Item.FindControl("CompanyId");
          var id = Convert.ToInt32(CompanyID.Value);

          var R2 = (Repeater)e.Item.FindControl("R2");
          var dso = GetData(id); // Get sub companies based on this company id

          R2.DataSource = dso;
          R2.DataBind();
       }  

Что-то в этом роде

person zgood    schedule 17.01.2019