Общий Asp.Net Таблица UserControl - PullRequest
       7

Общий Asp.Net Таблица UserControl

0 голосов
/ 06 декабря 2011

Я хочу спроектировать пользовательский элемент управления таблицей и динамически добавлять свойства пользовательских объектов. Я хочу заполнить эту таблицу объектом коллекции с универсальным типом. Как я могу это сделать ? Я не могу отправить свойства класса в PopulateTable с его пользовательскими заголовками.

То, что у меня есть (в пользовательском контроле), это ..

<table class="datatable">
    <thead>
        <asp:Literal id="ltrlHeaders" runat="server" />
    </thead>
    <tbody>
        <asp:Literal runat="server" ID="ltrlContent" />
    </tbody>
</table>

    public void PopulateTable(? myCollection)
    {
        List<string> headers = new List<string>();
        FieldInfo[] fields = type.GetFields();
        foreach (FieldInfo f in fields)
        {
            headers.Add(f.Name);
        }

        // headers
        StringBuilder headerString = new StringBuilder();
        headerString.Append("<thead>");
        headers.ForEach(delegate(string h)
        {
            headerString.Append(String.Format("<th>{0}</th>", h));
        });
        headerString.Append("</thead>");
        ltrlHeaders.Text = headerString.ToString();

        StringBuilder contentString = new StringBuilder();

        foreach (var item in list)
        {
            contentString.Append("<tr>");
            foreach (string fieldInfo in headers)
            {
                contentString.Append(String.Format("<td>{0}</td>", type.GetField(fieldInfo).GetValue(item) as string));
            }
            contentString.Append("</tr>");
        }
        ltrlContent.Text = contentString.ToString();
    }

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

Очень простой способ сделать то, что вы хотите, может выглядеть следующим образом. Я обновил его списком лиц, как определено в моем коде. Обратите внимание, что я также включил класс, производный от Person, чтобы вы могли видеть другие свойства.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Reflection;

public partial class _Default : System.Web.UI.Page
{

    public class Person
    {
        public string Name { get; set; }

        public string Title { get; set; }

    }


    public class WorkingPerson : Person
    {

        public string Job { get; set; }

    }


    protected void Page_Load(object sender, EventArgs e)
    {

        List<Person> people = new List<Person>();

        people.Add(new Person() {Name = "T", Title = "Mr" }) ;
        people.Add(new WorkingPerson() {Name="Face", Title="Mr", Job ="Film Star" } );


        TextBox textBox = new TextBox();

        Controls.Add(CreateTableFromObject<Person>(people));

    }



    public PlaceHolder CreateTableFromObject<T>(IEnumerable<T> objectList) where T : Person
    {

        PlaceHolder holder = new PlaceHolder(); 

        foreach (T thing in objectList)
        {

            Table table = new Table();


            PropertyInfo[] properties = thing.GetType().GetProperties();

            TableRow propertiesSpan = new TableRow();
            propertiesSpan.Cells.Add(new TableCell() { ColumnSpan = properties.Length, Text = String.Format("Properties of {0}", thing.GetType().FullName) });

            table.Rows.Add(propertiesSpan);

            TableRow tableRow = new TableRow();


            foreach (PropertyInfo propertyInfo in properties)
            {
                TableCell tc = new TableCell();
                tc.Text = propertyInfo.Name;
                tableRow.Cells.Add(tc);
            }

            table.Rows.Add(tableRow);

            holder.Controls.Add(table);

        }

        return holder;

    }


}

Это эффективно берет объект, использует отражение, чтобы обнаружить его свойства, а затем записывает их в ячейки таблицы. Вы можете изменить подпись так, чтобы она принимала вашу пользовательскую коллекцию, и изменить внутренние компоненты для отображения вашей таблицы.

0 голосов
/ 06 декабря 2011
public void PopulateTable<T>(T myCollection)

Предполагая, что T объекты могут быть преобразованы в string.Или вы можете захотеть:

public void PopulateTable<T>(IEnumerable<T> myCollection)

, если вы хотите иметь возможность передавать коллекцию и знать что-то о ее интерфейсе.

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