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

ASP.NET ListView数据控件动态数据绑定

  •  2
  • mirezus  · 技术社区  · 16 年前

    我正试图实现一个用于显示和编辑查找表/应用程序级变量的ListView数据控件。存在多个可绑定到ListView的实体类,因此需要将itemTemplate动态绑定到所选实体对象。

    例如,我有:

    AddressType { AddressTypeId, AddressTypeDescription}, 
    PhoneType { PhoneTypeId, PhoneType}, 
    MarriageStatusType { MarriageStatusId, marriageStatusType}
    

    这些生成的实体对象使我无法简单地执行以下代码段之类的操作,因为每个业务对象的ID和类型属性都不同。

    <ListView>
    ...
    
    <itemTemplate>
        <tr> 
           <td runat="server" id="tdId"> <%# Eval("ID") %> </td> 
           <td runat="server" id="tdType"> <%# Eval("TypeNameDescription") %> </td> 
        </tr>
    </itemTemplate>
    
    ...
    </ListView>
    

    我试图发现: 1。如何迭代ListView项以将适当的属性值插入到服务器端的HTML TD标记中。 2。如何在ListView项上使用DataBinder.Eval来插入该属性值。

    事先谢谢!

    3 回复  |  直到 16 年前
        1
  •  4
  •   flesh    16 年前

    好的,回答你的问题:

    • 可以使用父ListView中的OnitemDataBound事件迭代ListViewItem。然后,您可以使用它来数据绑定嵌套的子列表视图(或插入HTML或以您需要的任何方式操作列表的内容)。请确保在代码隐藏处理程序中使用ListViewItemEventArgs,以便轻松访问数据绑定项…
    • 可以使用databinder.eval在ListView中使用类似的方法动态填充中继器(注意,“getchildCategoryData”是一种代码隐藏方法):

    希望它有帮助。

    <asp:ListView ID="parentList" runat="server">
       <ItemTemplate>
          <asp:Repeater ID="childData" runat="server" DataSource='<%# GetChildCategoryData(DataBinder.Eval(Container.DataItem, "parentcategoryID")) %>'>.. </asp:Repeater>
       </ItemTemplate>
    </asp:ListView>
    
        2
  •  0
  •   Moran Helman    16 年前

    也许你的答案是在itemtemplate中绑定一个中继器。

    中继器将获得<%eval(“dataDictionary”)%>的数据源。

        3
  •  0
  •   likeuclinux    15 年前

    好的,我找到了在ListView中呈现转发器的方法,我不知道是否可以粘贴整个代码,因为它很长。结果html如下:

     
    • 时间1 [备注:以下是ListView内的转发器] 场景组名称1组名称2 s1g1混凝土g12混凝土1 s2G1conc2G2conc2型 S3g1混凝土12混凝土3
    • 时间2 [备注:以下是ListView内的转发器] 场景组名称1组名称2 s1g1混凝土g12混凝土1 s2G1conc2G2conc2型 S3g1混凝土12混凝土3
    • 时间3 [备注:以下是ListView内的转发器] 场景组名称1组名称2 s1g1混凝土g12混凝土1 s2G1conc2G2conc2型 S3g1混凝土12混凝土3

    最困难的是,组的数量可以不同

    我的ASPX页面如下:

    …嗯…论坛我不能用逐字逐句的代码,预块对某些字符不起作用。

     KeyValuePair<string, List<scenarioItem>> myData = (KeyValuePair<string, List<scenarioItem>>)(((System.Web.UI.WebControls.ListViewDataItem)(e.Item)).DataItem);
        Repeater repeater = (Repeater)e.Item.FindControl("childData");
        repeater.HeaderTemplate = new MyTemplate(ListItemType.Header);
        repeater.ItemTemplate = new MyTemplate(ListItemType.Item);
        repeater.AlternatingItemTemplate =
           new MyTemplate(ListItemType.AlternatingItem);
        repeater.FooterTemplate = new MyTemplate(ListItemType.Footer);
        repeater.DataSource = myData.Value;
        repeater.DataBind();
    
    
    
    public class MyTemplate : System.Web.UI.ITemplate
    

    { system.web.ui.webcontrols.listemtype模板类型; 公共MyTemplate(System.Web.UI.WebControls.ListItemType类型) { templateType=类型; }

    static void Item_DataBinding(object sender, System.EventArgs e)
    {
        PlaceHolder ph = (PlaceHolder)sender;
        RepeaterItem ri = (RepeaterItem)ph.NamingContainer;
        scenarioItem myDataItem = (scenarioItem)ri.DataItem;
    
        if (ri.ItemIndex == 0) { 
            //create the header column part once
            //Add ScenarioName
            ph.Controls.Add(new LiteralControl("<tr><td>ScenarioName</td>"));
    
            //Add group concentration part
            foreach (recGroupConcItem concItem in myDataItem.mGroupConcList)
            {
                ph.Controls.Add(new LiteralControl("<td>" + concItem.groupName + @"</td>"));
            }
            ph.Controls.Add(new LiteralControl("</tr>"));
    
        }
    
        //Add ScenarioName
        ph.Controls.Add(new LiteralControl("<tr><td>"+myDataItem.scenarioName+@"</td>"));
    
        //Add group concentration part
        foreach (recGroupConcItem concItem in myDataItem.mGroupConcList) {
            ph.Controls.Add(new LiteralControl("<td>" + concItem.groupConc.ToString() + @"</td>"));
        }
        ph.Controls.Add(new LiteralControl("</tr>"));
    }
    
    static void ItemAlt_DataBinding(object sender, System.EventArgs e)
    {
        PlaceHolder ph = (PlaceHolder)sender;
        RepeaterItem ri = (RepeaterItem)ph.NamingContainer;
        scenarioItem myDataItem = (scenarioItem)ri.DataItem;
    
        //Add ScenarioName
        ph.Controls.Add(new LiteralControl("<tr bgcolor=\"lightblue\"><td>" + myDataItem.scenarioName + @"</td>"));
    
        //Add group concentration part
        foreach (recGroupConcItem concItem in myDataItem.mGroupConcList)
        {
            ph.Controls.Add(new LiteralControl("<td>" + concItem.groupConc.ToString() + @"</td>"));
        }
        ph.Controls.Add(new LiteralControl("</tr>"));
    }
    
    static void ItemHeader_DataBinding(object sender, System.EventArgs e)
    {
        PlaceHolder ph = (PlaceHolder)sender;
        RepeaterItem ri = (RepeaterItem)ph.NamingContainer;
        scenarioItem myDataItem = (scenarioItem)ri.DataItem;
    
        //Add ScenarioName
        ph.Controls.Add(new LiteralControl("<tr><td>ScenarioName</td>"));
    
        //Add group concentration part
        foreach (recGroupConcItem concItem in myDataItem.mGroupConcList)
        {
            ph.Controls.Add(new LiteralControl("<td>" + concItem.groupName + @"</td>"));
        }
        ph.Controls.Add(new LiteralControl("</tr>"));
    }
    
    
    public void InstantiateIn(System.Web.UI.Control container)
    {
        PlaceHolder ph = new PlaceHolder();
        Label item1 = new Label();
        Label item2 = new Label();
        item1.ID = "item1";
        item2.ID = "item2";
    
        switch (templateType)
        {
            case ListItemType.Header:
                ph.Controls.Add(new LiteralControl("<table border=\"1\">"));
                //    "<tr><td><b>ScenarioName</b></td>" +
                //    "<td><b>Group1</b></td> <td><b>Group2</b></td> <td><b>Group3</b></td> <td><b>Group4</b></td> </tr>"));
                //ph.DataBinding += new EventHandler(ItemHeader_DataBinding);
                break;
            case ListItemType.Item:
                ph.DataBinding += new EventHandler(Item_DataBinding);
                break;
            case ListItemType.AlternatingItem:
                ph.DataBinding += new EventHandler(ItemAlt_DataBinding);
                break;
            case ListItemType.Footer:
                ph.Controls.Add(new LiteralControl("</table>"));
                break;
        }
        container.Controls.Add(ph);
    }
    

    }