Hakoo Desai
Hakoo Desai

Reputation: 185

Binding data to Header Template in Listview In Asp.net

I want to show some details like Name, Lic.# in header which is unique and not repeating for that particular Listview . Is there anyway to show this?

Upvotes: 4

Views: 10048

Answers (1)

IUnknown
IUnknown

Reputation: 22448

You can introduce page properties for data that you want to show in layout, get they from the first row dataItem in the ItemDataBound event handler and bind layout control in ListView's DataBound event handler:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="job_id" DataSourceID="SqlDataSource1">
          <LayoutTemplate>
               <table>
                    <thead>
                         <tr runat="server" id="headerRow">
                              <th>
                                   <%# FirstHeaderText %></th>
                              <th>
                                   <%# SecondHeaderText  %>
                              </th>
                         </tr>
                    </thead>
                    <tbody>
                         <tr runat="server" id="itemPlaceholder" />
                    </tbody>
               </table>
          </LayoutTemplate>
          <ItemTemplate>
               <tr>
                    <td>
                         <%# Eval("job_id")%></td>
                    <td>
                         <%# Eval("job_desc")%></td>
               </tr>
          </ItemTemplate>
     </asp:ListView>
     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:PUBSConnectionString %>"
          SelectCommand="SELECT [job_id], [job_desc] FROM [jobs]"></asp:SqlDataSource>

Server code:

protected string FirstHeaderText
{
    get { return ViewState["FirstHeaderText"] as string; }
    set { ViewState["FirstHeaderText"] = value; }
}
protected string SecondHeaderText
{
    get { return ViewState["SecondHeaderText"] as string; }
    set { ViewState["SecondHeaderText"] = value; }
}

protected void Page_Init(object sender, EventArgs e)
{
    ListView1.ItemDataBound += new EventHandler<ListViewItemEventArgs>(ListView1_ItemDataBound);
    ListView1.DataBound += new EventHandler(ListView1_DataBound);
}

void ListView1_DataBound(object sender, EventArgs e)
{
    ((HtmlTableRow)ListView1.FindControl("headerRow")).DataBind();
}

void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (string.IsNullOrEmpty(FirstHeaderText) && e.Item.ItemType == ListViewItemType.DataItem)
    {
        var dataRow = e.Item.DataItem as DataRowView;
        FirstHeaderText = dataRow["job_id"].ToString();
        SecondHeaderText = dataRow["job_desc"].ToString();
    }
}

Another available decision is to place header part into itemTemplate but show it only for the first record:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="job_id" DataSourceID="SqlDataSource1">
     <LayoutTemplate>
          <table>
               <asp:PlaceHolder runat="server" ID="itemPlaceholder" />
          </table>
     </LayoutTemplate>
     <ItemTemplate>
          <tr runat="server" visible='<%# (int)DataBinder.Eval(Container, "DataItemIndex") == 0 %>'>
               <th>
                    <%# Eval("job_id")%></th>
               <th>
                    <%# Eval("job_desc")%></th>
          </tr>
          <tr>
               <td>
                    <%# Eval("job_id")%></td>
               <td>
                    <%# Eval("job_desc")%></td>
          </tr>
     </ItemTemplate>
</asp:ListView>

Upvotes: 6

Related Questions