【问题标题】:How to dynamically display loop items in tables?如何在表格中动态显示循环项?
【发布时间】:2017-05-08 23:01:58
【问题描述】:

以下是设计图。

<table>
<tr>
<td>Project Title</td>
<td>Download Link</td>
</tr>
<tr>
<td><asp:Label ID="dlLbl" runat="server"></asp:Label></td>
<td><asp:Label ID="dlLink" runat="server"></asp:Label></td>
</tr>
</table>

以下是后端代码。

foreach (SPListItem objInnovationListItem in objInnovationList.Items)
        {
            if (Convert.ToString(objInnovationListItem["Innovation Approval Status"])== status)
            {
                countStatus++;

                //Displays name of the document and download link
                dlLbl.Text = objInnovationListItem["Project Title"].ToString();
                dlLink.Text = "<a href='/RIDepartment/Innovation%20Submission/" + objInnovationListItem.File.Name + "'>Download</a><br>";
            }
        }

因此,我的问题是,当循环中有超过 1 个时,我可以做些什么来让表格动态容纳文档和 dl 链接?

欣赏一些代码示例。

【问题讨论】:

  • 尝试查看 ASP:Repeater - 它应该可以满足您的需求。

标签: c# sharepoint-2010 html-table


【解决方案1】:

使用您的代码样式(手动创建没有网络控件的 html),我建议您查看ASP.NET MVC 方面。但我可以回答你的问题:

首先 - 你需要像这样使用 asp:Repeater:

<table>
    <tr>
        <td>Project Title</td>
        <td>Download Link</td>
    </tr>
    <asp:Repeater ID="repLinks" runat="server" 
        onitemdatabound="repLinks_ItemDataBound">
        <ItemTemplate>
            <tr>
                <td>
                    <asp:Label ID="lblProject" runat="server" Text="Label"></asp:Label>
                </td>
                <td>
                    <asp:HyperLink ID="hlLink" runat="server">HyperLink</asp:HyperLink>
                </td>
            </tr>
        </ItemTemplate>
    </asp:Repeater>
</table>

第二:您需要初始化要显示的集合。例如:你想显示一个objInnovationListItem类的集合:

public class objInnovationListItem
    {
        public string Name { get; set; }
        public string Title { get; set; }
        public override string ToString()
        {
            return Title;
        }
    }

接下来你需要做的:

        // list - it's source List<objInnovationListItem>
        var bindList = list.Where(p => objInnovationListItem["Innovation Approval Status"] == status); // filter your collection - replace you foreach and if statement

        repLinks.DataSource = bindList; // set to repeater your displayed collection
        repLinks.DataBind(); // bind your collection

最后 - 您需要在您的 Repeater ItemTemplate 中指明如何显示您的 objInnovationListItem 实例 - 订阅您的 Repeater ItemDataBound 事件:

        protected void repLinks_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        var item = e.Item.DataItem as objInnovationListItem;
        ((Label) e.Item.FindControl("lblProject")).Text = item.Name;
        ((HyperLink) e.Item.FindControl("hlLink")).NavigateUrl = string.Format("/downloaduri?id={0}", item.Title);
    }

结果将如下所示:

【讨论】:

  • 嗨,请问。我在哪里放置代码的第三部分?谢谢
  • 并报告以下错误 错误 1 ​​'Microsoft.SharePoint.SPList' 不包含 'Where' 的定义,并且没有扩展方法 'Where' 接受类型为 'Microsoft.SharePoint.SPList 的第一个参数' 可以找到(您是否缺少 using 指令或程序集引用?)
  • 第三部分,您必须放置的代码,而不是您想要绑定您的集合的位置。它可以在任何地方 - 在您的 Form_Load 事件或 Button_Click 事件上。
  • 关于 'Where' - 它是 LINQ 的一部分。 LINQ 在 c# 3.0 和 .NET Framework 3.0 中可用。要使用 LINQ,您需要包含下一个指令“使用 System.Linq;”在代码文件的开头。
【解决方案2】:

我会使用中继器...像这样(代码可能不准确):

<table>
    <tr>
        <td>Project Title</td>
        <td>Download Link</td>
    </tr>
    <asp:Repeater id="rptItems" runat="server">
        <ItemTemplate>
            <tr>
                <td><asp:Label ID="dlLbl" runat="server"></asp:Label></td>
                <td><a href="/RIDepartment/Innovation%20Submission/<%# Eval("File").Name %>">Download</a><br></td>
            </tr>
        </ItemTemplate>
    </asp:Repeater>
</table>

然后在中继器的 ItemDataBound 事件中,执行如下操作:

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {


            ((Label)e.Item.FindControl("dlLbl")).Text= ((SPListItem)e.Item.DataItem)["Project Title"].ToString();

      }

【讨论】:

    【解决方案3】:

    为什么不跳过服务器端控件,直接编写实际的 html?

    在你的 aspx 文件中包含这个 div:

        <div runat="server" id="divTable"></div>
    

    并将其放入您的 Page_Load() 中:

        StringBuilder sb = new StringBuilder();
        sb.Append("<table><tr><td>Project Title</td><td>Download Link</td></tr>");
        for (int i = 0; i < 10; i++)
        {
            sb.AppendFormat("<tr><td>{0}</td><td><a href='{1}'>{1}</a></td></tr>", "Title", "Link");
        }
        sb.Append("</table>");
        divTable.InnerHtml = sb.ToString();
    

    您当然需要将“标题”和“链接”替换为适当的值。

    您的其他选择是实际创建新标签和链接,但众所周知,当您动态创建服务器端控件时,ASP.net 很难使用。

    【讨论】:

    • 我假设您的意思是生成有问题的 HTML,然后将其泵入类似于 asp:Literal...
    • ASP.NET 使用动态创建服务器端控件并不难...为什么还要走这条路?只需使用转发器/gridview 模板,并按照使用 .NET 时的操作方式进行操作。这样做是违反直觉的,因为显然标题/链接值将在每次迭代中发生变化。
    • 你重新发明了轮子。甚至不要使用 DataControls,例如中继器,它可以使用标准的服务器端控件,而无需动态生成 html。
    猜你喜欢
    • 2013-03-07
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2021-08-15
    • 2016-07-25
    相关资源
    最近更新 更多