代码之家  ›  专栏  ›  技术社区  ›  nicolaskruchten

将元组呈现到ASP.NET 2.0中的表的简单方法?

  •  1
  • nicolaskruchten  · 技术社区  · 15 年前

    假设我有一个像 Dictionary<string, Dictionary<string, int>> 或者类似的,我希望将其呈现为一个HTML表,其中行标题作为第一个字符串键,列标题作为第二个字符串键。是否有内置或其他控件?

    2 回复  |  直到 15 年前
        1
  •  3
  •   womp    15 年前

    没有内置控件可以识别这样复杂的数据结构。您需要为它做一些自定义编码。

    使用带有itemdatabound事件处理程序的中继器可能很容易完成它。就在我头顶上,没有测试:

    <asp:Repeater ID="Repeater1" runat="server"  OnItemDataBound=" Repeater1_OnItemDataBound">
    <ItemTemplate>
       <asp:Literal ID="Literal1" runat="server" />
    </ItemTemplate>
    </asp:Repeater>
    
    
    protected void Repeater1_OnItemDataBound(Object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==
              ListItemType.AlternatingItem)
        {
            var rowHeader= (e.Item.DataItem).Key;
            var columnHeaders = (e.Item.DataItem).Value;
            foreach (var header in columnHeaders)
            {
                  // build string to populate table row, assign to Literal1
            }
        }
    }
    
        2
  •  0
  •   Chris Mullins    15 年前

    可以使用嵌套的数据绑定控件并跳过OnitemDataBoundStep,只需使用正在绑定的外部项的属性绑定内部控件。

    因此,对于您的案例,字典中的每个条目都包含一个键和另一个字典。因此,每次绑定时,都可以访问要设置为内部数据绑定控件的数据源的该项的字典。

    请考虑以下示例:

    <%@ Page Language="C#" %>
    
    <%@ Import Namespace="System.Collections.Generic" %>
    
    <script runat="server">   
        protected void Page_Load(object sender, EventArgs e)
        {
            Dictionary<string, Dictionary<string, int>> TestDict = new Dictionary<string, Dictionary<string, int>>();
    
    
            //This is just loading the test dictionary    
            for (int i = 0; i < 10; i++)
            {
                Dictionary<string, int> ColData = new Dictionary<string, int>();
    
                TestDict.Add("Row Header " + i, ColData);
                for (int j = 0; j < 5; j++)
                {
                    ColData.Add("Col Header " + j, i + j);
                }
            }
    
            //Bind the Outer Repeater
            RepeaterRow.DataSource = TestDict;
            RepeaterRow.DataBind();
    
    
    
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        <form id="form1" runat="server">
    
    
        <asp:Repeater ID="RepeaterRow" runat="server">
            <HeaderTemplate>
                <table>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <th>
                        <%# Eval("Key") %>
                    </th>
                    <asp:Repeater ID="RepeaterColumn" DataSource='<%# Eval("Value")%>' runat="server">
                        <ItemTemplate>
                            <td>
                                <%# Eval("Value") %>
                            </td>
                        </ItemTemplate>
                    </asp:Repeater>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table>
            </FooterTemplate>
        </asp:Repeater>
    
    
        </form>
    </body>
    </html>
    
    推荐文章