2014-02-04 1 views
2

У меня есть вложенные ListViewУплотненный ListView с использованием двух различных sqldatasources

<asp:ListView ID="lst_productsWithDiscounts" DataKeyNames="ProductID" runat="server" DataSourceID="source_discountProducts" ItemPlaceholderID="plc_product" OnItemDataBound="lst_productsWithDiscounts_ItemDataBound"> 
<LayoutTemplate> 
    <table> 
     <tr> 
      <td>Name</td> 
      <td>Price</td> 
      <td>TVA</td> 
      <td>Discount</td> 
      <td>Price</td> 
      <td>New discount</td> 
      <td>New price</td> 
     </tr> 
     <tr id="plc_product" runat="server"> 
     </tr> 
    </table> 


</LayoutTemplate> 
<ItemTemplate> 
    <tr> 
     <td><%# Eval("ProductCode").ToString()+"/"+ Eval("Name").ToString() %></td> 
     <td><%# Eval("SellPrice").ToString() %></td> 
     <td><%# Eval("TVA").ToString() %></td> 
     <td><%# Eval("Discount").ToString() %></td> 
     <td><%# BC_Common.Util.Calc(double.Parse(Eval("SellPrice").ToString()),double.Parse(Eval("Discount").ToString()),Convert.ToInt32(Eval("TVA").ToString()),1).ToString() %></td> 
     <td><%# Eval("NewDiscount").ToString() %></td> 
     <td><%# BC_Common.Util.Calc(double.Parse(Eval("SellPrice").ToString()), double.Parse(Eval("NewDiscount").ToString()), Convert.ToInt32(Eval("TVA").ToString()), 1).ToString()%></td> 
    </tr> 
    <tr> 
    <td colspan="7"> 
     <asp:ListView ID="lst_variants" runat="server" DataSourceID="source_discountVariants" ItemPlaceholderID="plc_variant"> 
      <LayoutTemplate> 
      <table> 
       <tr> 
        <td>Variant name</td> 
        <td></td> 
        <td>Stock</td> 
        <td>Reserved</td> 
       </tr> 
       <tr id="plc_variant" runat="server"></tr> 
      </table> 
      </LayoutTemplate> 
      <ItemTemplate> 
       <td><%# Eval("Nume").ToString() %></td> 
       <td></td> 
       <td><%# Eval("Stock").ToString() %></td> 
       <td><%# Eval("Reserved").ToString() %></td> 
      </ItemTemplate> 
     </asp:ListView> 
    </td> 
    </tr> 
</ItemTemplate> 

protected void lst_productsWithDiscounts_ItemDataBound(object sender, ListViewItemEventArgs e) 
    { 
     source_discountVariants.SelectParameters["ProductID"].DefaultValue = lst_productsWithDiscounts.DataKeys[e.Item.DataItemIndex]["ProductID"].ToString(); 

     ListView lst_variants = e.Item.FindControl("lst_variants") as ListView; 
     lst_variants.DataBind(); 

    } 

Я не знаю, почему, но вложенная ListView (lst_variants) является уникальным для всех продуктов, и это соответствует результату для последнего продукта от lst_productsWithDiscounts

Итак, как мне связать второй список с помощью sqldatasource?

ответ

0

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

Удалить свойство «DataSourceID» из разметки lst_variants:

<asp:ListView ID="lst_variants" runat="server" ItemPlaceholderID="plc_variant"> 
     <LayoutTemplate> 

А затем обновить свой код, чтобы установить, что в коде:

protected void lst_productsWithDiscounts_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    source_discountVariants.SelectParameters["ProductID"].DefaultValue = lst_productsWithDiscounts.DataKeys[e.Item.DataItemIndex]["ProductID"].ToString(); 

    ListView lst_variants = e.Item.FindControl("lst_variants") as ListView; 
    lst_variants.DataSourceID = source_discountVariants; 
    lst_variants.DataBind(); 
} 

Примечание: было бы полезно, чтобы увидеть разметку для вашего SqlDataSource (s).

1

Я нашел ответ на другой пост с этого сайта: ASP.NET VB Nested Listviews

Так результат:

<asp:ListView ID="lst_productsWithDiscounts" DataKeyNames="ProductID" runat="server" DataSourceID="source_discountProducts" ItemPlaceholderID="plc_product" > 
<LayoutTemplate> 
    <table> 
     <tr> 
      <td>Name</td> 
      <td>Price</td> 
      <td>TVA</td> 
      <td>Discount</td> 
      <td>Price</td> 
      <td>New discount</td> 
      <td>New price</td> 
     </tr> 
     <tr id="plc_product" runat="server"> 
     </tr> 
    </table> 


</LayoutTemplate> 
<ItemTemplate> 
    <tr> 
     <td><asp:Label ID="lbl_id" runat="server" Text='<%# Eval("ProductID").ToString() %>'></asp:Label> <%# Eval("ProductCode").ToString()+"/"+ Eval("Name").ToString() %></td> 
     <td><%# Eval("SellPrice").ToString() %></td> 
     <td><%# Eval("TVA").ToString() %></td> 
     <td><%# Eval("Discount").ToString() %></td> 
     <td><%# BC_Common.Util.Calc(double.Parse(Eval("SellPrice").ToString()),double.Parse(Eval("Discount").ToString()),Convert.ToInt32(Eval("TVA").ToString()),1).ToString() %></td> 
     <td><%# Eval("NewDiscount").ToString() %></td> 
     <td><%# BC_Common.Util.Calc(double.Parse(Eval("SellPrice").ToString()), double.Parse(Eval("NewDiscount").ToString()), Convert.ToInt32(Eval("TVA").ToString()), 1).ToString()%></td> 
    </tr> 
    <tr> 
    <td colspan="7"> 
     <asp:ListView ID="lst_variants" runat="server" DataSourceID="source_discountVariants" ItemPlaceholderID="plc_variant"> 
      <LayoutTemplate> 
      <table> 
       <tr> 
        <td>Variant name</td> 
        <td></td> 
        <td>Stock</td> 
        <td>Reserved</td> 
       </tr> 
       <tr id="plc_variant" runat="server"></tr> 
      </table> 
      </LayoutTemplate> 
      <ItemTemplate> 
      <tr> 
       <td><%# Eval("Nume").ToString() %></td> 
       <td></td> 
       <td><%# Eval("Stock").ToString() %></td> 
       <td><%# Eval("Reserved").ToString() %></td> 
       </tr> 
      </ItemTemplate> 
      <EmptyDataTemplate> 
      empty data template 
      </EmptyDataTemplate> 
      <EmptyItemTemplate> 
       empty item 
      </EmptyItemTemplate> 
     </asp:ListView> 

     <asp:SqlDataSource ID="source_discountVariants" runat="server" ConnectionString='<%$ ConnectionStrings: DatabaseConnectionString %>' 

      SelectCommand="SELECT * FROM ProductVariant V INNER JOIN VariantForProClientDiscount D ON D.ID_Variant=V.ID INNER JOIN Product P ON P.ID=V.ProductID WHERE [email protected]" 
      SelectCommandType="Text"> 
     <SelectParameters> 
     <asp:ControlParameter Name="ProductID" ControlID="lbl_id" PropertyName="Text" DbType="Int32" /> 
    </SelectParameters> 
    </asp:SqlDataSource> 

    </td> 
    </tr> 
</ItemTemplate> 

+0

Я не знал, что вы можете вложить SqlDataSource в элемент ItemTemplate ListView. Интересно. Просто любопытно, вы попробовали решение, которое я предоставил? Мне было любопытно, будет ли это так или нет. – jadarnel27

+0

К сожалению, нет. Но я не думаю, что это сработало бы, потому что в списке было установлено DataSourceID = "source_discountVariants". В следующий раз, когда мне придется работать с вложенным списком, я попробую ваше решение только ради любопытства, и я сообщу вам о результатах. – POIR

0

Это прекрасно работает для меня. У меня есть родительский списокView с дочерним списком, вложенным внутри. И я создал функцию, которая возвращает datatable. Эта функция запускает хранимый прецедент из базы данных

 Protected Sub lvParent_ItemDataBound(sender As Object, e As 
    ListViewItemEventArgs) 
      Dim dtChild As DataTable 
      dtChild = Child_SEL(New Guid(lvParent.DataKeys(e.Item.DataItemIndex)("ID").ToString())) 
      Dim lvChild As ListView = TryCast(e.Item.FindControl("lvChild"), ListView) 
      lvChild.DataSource = dtChild 
      lvChild.DataBind() 
     End Sub 



    Public Function Child_SEL(ParentID As Object) As DataTable 
      Dim conn As SqlConnection = New SqlConnection(ConnectionString) 
      Dim cmd As SqlCommand = conn.CreateCommand() 
      Dim dt As DataTable = Nothing 
      Dim ds As New DataSet 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.CommandText = "Child_SEL" 
Dim param_ParentID As SqlParameter = cmd.Parameters.Add("@ParentID ", SqlDbType.UniqueIdentifier) 
      param_ParentID.Value = ParentID 
      Try 
       conn.Open() 
       Dim da As New SqlDataAdapter(cmd) 
       da.Fill(ds, "x") 
       dt = ds.Tables("x") 
      Catch e As Exception 
       Error_INS(Today, Page.ToString, MethodBase.GetCurrentMethod().Name.ToString(), e.Message.ToString) 
       HttpContext.Current.Response.Redirect("~/Secure/Error.aspx") 
      Finally 
       conn.Close() 
      End Try 
      Return dt 
     End Function 

    'Stored Procedure Code 
    ALTER PROC [dbo].[Child_SEL] 
    @ParentID UNIQUEIDENTIFIER      
    AS 
    BEGIN 
    SELECT Bla,Bla,Bla 
    FROM Child WHERE ParentID = @ParentID 
    END