Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1624
  • Last Modified:

Dynamically creating a table within a repeater based on rows returned

Hi. I'm sure this question has been answered before around here, but maybe I just can't find the keywords that will correctly get me to it, so Im going to pose my question anyway.

I have a repeater which is dynamically populated via databinding from a stored procedure. This stored proc will ALWAYS pull back the same data per row, but the amount of rows can vary. I basically need some help with the logic to create a table dynamically within the repeater to house the returns from the stored proc, but so that it can handle a total of 3 items per row, or as little as 1. Just in case that was a little vague, I want a table with 3 cells per row max, but able to house 1 or 2 if there are only 1 or 2 returns from the query.

Below is what I have so far (you'll notice the rows and cells are missing from within the repeater). I am also pasting my databind code from the backend as well. Help!!

ASPX ---------------------
<table border="0" cellspacing="0" cellpadding="0" width="100%">
                         <tr>
                           <td>
                            <table border="0" cellspacing="0" cellpadding="0" width="100%">
                            <asp:Repeater ID="rptProductsList" runat="server">
                            <ItemTemplate><div class="ProductTitle"><%#Eval("ProductTitle")%> (<%#Eval("ProductModelNumber")%>)</div><br />
                            <a onclick="MM_openBrWindow('showPic.aspx?imageID=<%#Eval("ImageID") %>','','resizable=yes,scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,width=600,height=700'); return false;" href="#">
                            <img src=<%#Eval("ImagePhysicalLocation")%>th<%#Eval("ImageFileName")%> border="0" /></a>
                            </ItemTemplate>
                            </asp:Repeater>
                            </table>
                            </td>
                         </tr>
                        </table>

VB-----------------
 Dim cn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)

        Dim cmd As New SqlCommand("uspGetProductsFromSubCat", cn)
        cmd.CommandType = Data.CommandType.StoredProcedure
        cmd.Parameters.Add(New SqlParameter("@ProductCategoryID", Data.SqlDbType.Int))
        cmd.Parameters("@ProductCategoryID").Value = Session.Item("currentSubCatID")
        cn.Open()
        rptProductsList.DataSource = cmd.ExecuteReader()
        rptProductsList.DataBind()
        cn = Nothing
0
nuvium
Asked:
nuvium
2 Solutions
 
Solar_FlareCommented:
are you trying to do something like this?
<asp:repeater ID=xx runat=server>
<HeaderTemplate>
   <table border="0" cellspacing="0" cellpadding="0" width="100%">
</HeaderTemplate>
<FooterTemplate>
   </table>
</FooterTemplate>
<ItemTemplate>
   <tr>
          <td>        
                  <div class="ProductTitle"><%#Eval("ProductTitle")%> (<%#Eval("ProductModelNumber")%>)</div>
          </td>
          <td>
                  <a onclick="MM_openBrWindow('showPic.aspx?imageID=<%#Eval("ImageID") %>','','resizable=yes,scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,width=600,height=700'); return false;" href="#"><img src=<%#Eval("ImagePhysicalLocation")%>th<%#Eval("ImageFileName")%> border="0" /></a>
           </td>
     </tr>
</ItemTemplate>
 
</asp:repeater>

Open in new window

0
 
nuviumAuthor Commented:
You have the right idea, but my needs are a little bit more in depth. I understand using the header and foorter templates to open and close the table, but basically I need the table to have three cells per row (MAX). Each cell will contain a single row return from the database (this includes an image, and some description info). After three of these cells, the row for the table is done, and a new row starts.

Now, using what you showed me above, it looks like you have one row of the database return per table row on the front end, with two cells, one with the description info, one with the image. You understand the difference between what I need and what you showed me?

If it helps at all, I've done this before (which is why im kicking my own ass over forgetting the logic). I remember somone showed me how to do it, and I had to do some logic on the backend that basically dynamically created cells and open/close <tr>'s based on whether a) there have been 3 rows returned from the stored proc (one row goes into each of the three maximum cells per table row on the front end). I believe the logic centered around whether or not it was an even or odd count as to how to handle the creation.

This all sounds much more complicated than it is. I basically just need the repeater to dynamically create a table which has 3 cells per row maximum, each cell housing a full row return from the database. The only catch is, in some instances, only one or two rows will be returned (thus not even having a need for three cells). The table needs to be smart enough not to break when this happens, or populate the remaining cells with empty space.

Let me know if I can explain this better.
0
 
photowhizCommented:
You need a literal to insert the <tr> when appropriate. Do this:

    <asp:Repeater id=repeater1 runat="server">
<HeaderTemplate>
    <table>
    <tr>
</HeaderTemplate>

<ItemTemplate>
      <td><div class="ProductTitle"><%#Eval("ProductTitle")%> (<%#Eval("ProductModelNumber")%>)</div><br />
                            <a onclick="MM_openBrWindow('showPic.aspx?imageID=<%#Eval("ImageID") %>','','resizable=yes,scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,width=600,height=700'); return false;" href="#">
                            <img src=<%#Eval("ImagePhysicalLocation")%>th<%#Eval("ImageFileName")%> border="0" /></a></td>
      <asp:Literal id="itemLiteral" runat="server" Text='<%# RepeaterItemSeparator() %>' />
</ItemTemplate>

<FooterTemplate>
    </tr>
    </table>
</FooterTemplate>
    </asp:Repeater>

where your code-behind includes:
      
            private int itemCount = 0;


            public string RepeaterItemSeparator()
            {
                  itemCount++;

                  if ( ((itemCount%3) == 1) && (itemCount != 1) )
                        return "</tr>\r\n\t<tr>";
                  else
                        return "";
            }

    <asp:Repeater id=repeater1 runat="server">
<HeaderTemplate>
    <table>
    <tr>
</HeaderTemplate>
 
<ItemTemplate>
	<td><asp:Label ID="label2" runat="server" Text='<%#  Server.HtmlEncode(DataBinder.Eval(Container.DataItem, "Name").ToString()) %>' /></td>
	<asp:Literal id="itemLiteral" runat="server" Text='<%# RepeaterItemSeparator() %>' />
</ItemTemplate>
 
<FooterTemplate>
    </tr>
    </table>
</FooterTemplate>
    </asp:Repeater>

Open in new window

0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
photowhizCommented:
Well, EE's wonderful Code Snippet box totally messed that up. Just ignore the code box, and let me know if the reply doesn't make sense.
0
 
RHADMINCommented:
nuvium:

I had the exact same question as yours when I did the search yesterday on the experts-exchange for solutions. I found a very simple and instant solution for it by using CSS - display property.

(Product.aspx)
<ItemTemplate>
<table>
   <tr style="display:<%#DisplayOrNotFunction(Eval("ProductName"))%>"><td><%#Eval("ProductName")%></td></tr>
</table>
</ItemTemplate>

(CodeBehind: Product.vb)
Function DisplayOrNotFunction(ByVal sender As Object)
    If sender Is Nothing Then
         Return "none"
    End If
    If sender.ToString().Length > 0 Then
        Return "block"
    Else
        Return "none"
    End If
End Function

-Rick
0
 
Computer101Commented:
Forced accept.

Computer101
EE Admin
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now