简体   繁体   中英

repeater: retrieve columns headers from database

Client:

<asp:Repeater ID="Repeater1" runat="server">
            <HeaderTemplate>
                <table id="Table_car">
                    <tr>
                        <th>Pos#</th>
                        <th>Model</th>
                        <th>Price</th>
                        <th>Image</th>
                    </tr>
            </HeaderTemplate>

            <ItemTemplate>
                <tr>
                    <td><%# Eval("Pos#") %></td>
                    <td><%# Eval("Model") %></td>
                    <td><%# Eval("Price") %></td>
                    <td><%# Eval("Image ") %></td>
                </tr>
            </ItemTemplate>

Server:

protected void Page_Load(object sender, EventArgs e) { var table = new DataTable();

  try { using (var conn = new SqlConnection(_connectionString)) { using (var cmd = new SqlCommand("spFilterByContinent", conn)) { using (var adapter = new SqlDataAdapter(cmd)) { cmd.CommandType = CommandType.StoredProcedure; adapter.Fill(table); } } } Repeater1.DataSource = table; Repeater1.DataBind(); } catch (Exception exception) { //TODO: write excepetion } } public void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Header) { string header1 = string.Empty; string header2 = string.Empty; string header3 = string.Empty; string header4 = string.Empty; // Retrieve headers from database and assign to variables SetHeaderValue(e.Item, "litHeader1", header1); SetHeaderValue(e.Item, "litHeader2", header2); SetHeaderValue(e.Item, "litHeader3", header3); SetHeaderValue(e.Item, "litHeader4", header4); } } private void SetHeaderValue(RepeaterItem item, string litId, string headerText) { var lit = item.FindControl(litId) as Literal; if (lit != null) lit.Text = headerText; } } 

I am using a repeater for retrieving data from db,

my question is: How can I retrieve columns headers from db also, not just the data itself? <# Eval("COLUMN HEADER")%> <---alike

Headers are not databound as the items of a repeater (see this question and its answers for details). But you can adjust the headers in the ItemCreated event of the Repeater. First, you'd need to place some literal controls in the headers and add a handler for the ItemCreated event:

<asp:Repeater ID="Repeater1" runat="server" OnItemCreated="Repeater1_ItemCreated">
    <HeaderTemplate>
        <table id="Table_car">
            <tr>
                <th><asp:Literal ID="litHeader1" runat="server" /></th>
                <th><asp:Literal ID="litHeader2" runat="server" /></th>
                <th><asp:Literal ID="litHeader3" runat="server" /></th>
                <th><asp:Literal ID="litHeader4" runat="server" /></th>
            </tr>
        </HeaderTemplate>
    </HeaderTemplate>
    <!-- ... -->
</asp:Repeater>

Then you'd need to implement the event handler in the code behind file. Based on your question, this sample assumes that you want to use the column names of the data table that is assigned as the DataSource of the Repeater:

protected void Repeater1_ItemCreated(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Header)
    {
         var tbl = (DataTable)((Repeater)sender).DataSource;
         SetHeaderValue(e.Item, "litHeader1", tbl, 0);
         SetHeaderValue(e.Item, "litHeader2", tbl, 1);
         SetHeaderValue(e.Item, "litHeader3", tbl, 2);
         SetHeaderValue(e.Item, "litHeader4", tbl, 3);
    }
}

private void SetHeaderValue(RepeaterItem item, string litId, DataTable tbl, int colIndex)
{
    var lit = item.FindControl(litId) as Literal;
    if (lit != null)
    {
        string headerText = 
            tbl.Columns.Count > colIndex ? tbl.Columns[colIndex].ColumnName : "Not set";
        lit.Text = headerText;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM