repeater:从数据库中检索列标题

时间:2014-04-08 19:36:34

标签: c# asp.net

客户端:

<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>

服务器:

  

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;
}
}

我正在使用转发器从db中检索数据,

我的问题是:如何从db中检索列标题,而不仅仅是数据本身? &lt; #Eval(&#34; COLUMN HEADER&#34;)%&gt; &LT; ---一样

1 个答案:

答案 0 :(得分:1)

标题不是数据绑定作为转发器的项目(有关详细信息,请参阅此question及其答案)。但您可以在Repeater的 ItemCreated 事件中调整标题。首先,您需要在标题中放置一些文字控件并为ItemCreated事件添加处理程序:

<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>

然后,您需要在代码隐藏文件中实现事件处理程序。根据您的问题,此示例假定您要使用分配为Repeater的DataSource的数据表的列名:

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;
    }
}