2

我正在尝试实现一个 ListView 数据控件来显示和编辑查找表/应用程序级变量。ListView有多个实体类可以绑定,所以ItemTemplate需要动态绑定到选中的实体对象。

例如我有:

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

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

<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 来插入该属性值。

提前致谢!

4

3 回答 3

4

好的回答你的问题:

  • 您可以使用父 ListView 中的 OnItemDataBound 事件来迭代 ListViewItems。然后,您可以使用它来对嵌套的子 ListView 进行数据绑定(或插入 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>
于 2008-12-23T11:42:48.590 回答
0

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

中继器将获得 <%# Eval("DataDictionary") %> 的数据源。

于 2008-12-23T11:03:41.977 回答
0

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

 
  • 时间1 [评论:以下是列表视图中的转发器] 场景名称组名称1组名称2 S1g1Conc1g2Conc1 S2g1Conc2g2Conc2 S3g1Conc1g2Conc3
  • 时间2 [评论:以下是列表视图中的转发器] 场景名称组名称1组名称2 S1g1Conc1g2Conc1 S2g1Conc2g2Conc2 S3g1Conc1g2Conc3
  • 时间3 [评论:以下是列表视图中的转发器] 场景名称组名称1组名称2 S1g1Conc1g2Conc1 S2g1Conc2g2Conc2 S3g1Conc1g2Conc3

困难的部分是组的数量可以不同

我的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.ListItemType 模板类型;public MyTemplate(System.Web.UI.WebControls.ListItemType type) { templateType = type; }

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

}

于 2010-03-09T22:30:41.940 回答