Как динамически отображать элементы цикла в таблицах? - PullRequest
1 голос
/ 07 ноября 2011

Ниже приведен дизайн.

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

Следовательно, мой вопрос: что я могу сделать, чтобы таблицыдинамически размещать документ и ссылку dl, когда в цикле больше 1?

Оценить некоторые примеры кода.

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Я бы использовал ретранслятор ... Примерно так (код может быть не точным):

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

      }
1 голос
/ 07 ноября 2011

С вашим стилем кода (создание 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

и последнее - вам нужно указать в вашем шаблоне ItemRetater, как отображать ваш экземпляр 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);
    }

Результат будет выглядеть так:

Result

0 голосов
/ 07 ноября 2011

Почему бы вам не пропустить элементы управления на стороне сервера и просто написать фактический html?

Включите этот div в свой файл aspx:

    <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 общеизвестно сложно работать при динамическом создании серверных элементов управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...