Как создать GridView, подобный шаблонному настраиваемому серверному серверному элементу управления ASP.NET - PullRequest
4 голосов
/ 13 апреля 2010

Я пытаюсь разработать очень простой шаблонный серверный элемент управления, похожий на GridView. По сути, я хочу, чтобы элемент управления был добавлен на странице .aspx следующим образом:

    <cc:SimpleGrid ID="SimpleGrid1" runat="server">
         <TemplatedColumn>ID: <%# Eval("ID") %></ TemplatedColumn>
         <TemplatedColumn>Name: <%# Eval("Name") %></ TemplatedColumn>
         <TemplatedColumn>Age: <%# Eval("Age") %></ TemplatedColumn>
    </cc:SimpleGrid>

и при предоставлении следующего источника данных:

    DataTable table = new DataTable();
    table.Columns.Add("ID", typeof(int));
    table.Columns.Add("Name", typeof(string));
    table.Columns.Add("Age", typeof(int));

    table.Rows.Add(1, "Bob", 35);
    table.Rows.Add(2, "Sam", 44);
    table.Rows.Add(3, "Ann", 26);

    SimpleGrid1.DataSource = table;
    SimpleGrid1.DataBind();

результат должен быть такой таблицей HTML.

 -------------------------------
 | ID: 1 | Name: Bob | Age: 35 |
 -------------------------------
 | ID: 2 | Name: Sam | Age: 44 |
 -------------------------------
 | ID: 3 | Name: Ann | Age: 26 |
 -------------------------------

Основная проблема в том, что я не могу определить TemplatedColumn. Когда я пытался сделать это так ...

    private ITemplate _TemplatedColumn;
    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateContainer(typeof(TemplatedColumnItem))]
    [TemplateInstance(TemplateInstance.Multiple)] 
    public ITemplate TemplatedColumn
    {
        get { return _TemplatedColumn; }
        set { _TemplatedColumn = value; }
    }

.. и впоследствии создать экземпляр шаблона в CreateChildControls. Я получил следующий результат, который мне не нужен:

 -----------
 | Age: 35 |
 -----------
 | Age: 44 |
 -----------
 | Age: 26 |
 -----------
  • Я знаю, что то, чего я хочу достичь, бессмысленно, и я могу использовать DataGrid для достижения этого, но я привожу этот очень простой пример, потому что, если я знаю, как это сделать, я смогу разработать необходимый мне элемент управления , Спасибо.

Ответы [ 3 ]

1 голос
/ 13 апреля 2010

Взгляните на эту статью: Создание пользовательских шаблонных элементов управления ASP.NET на основе DataBound

Он довольно старый, но я думаю, он все еще действителен.

0 голосов
/ 21 мая 2012

Я знаю, как избавить вас от этого:

DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Age", typeof(int));

table.Rows.Add(1, "Bob", 35);
table.Rows.Add(2, "Sam", 44);
table.Rows.Add(3, "Ann", 26);

SimpleGrid1.DataSource = table;
SimpleGrid1.DataBind();

к этому:

-------------------------------
| ID: 1 | Name: Bob | Age: 35 |
-------------------------------
| ID: 2 | Name: Sam | Age: 44 |
-------------------------------
| ID: 3 | Name: Ann | Age: 26 |
-------------------------------

Получено из ITemplate:

public class CustomColumnDefiner : ITemplate { ...

Добавить открытое поле в CustomColumnDefiner для имени столбца и ListItemType.

переопределить эту функцию в CustomColumnDefiner:

void ITemplate.InstantiateIn(System.Web.UI.Control container)

В InstantiateIn, если элемент ListItemType имеет значение ListItemType.Item, проверьте имя столбца. Если имя столбца - Возраст, измените значение входящей метки на «Возраст:» + входящее значение. Это в основном постобработка каждой ячейки столбца для добавления части «Возраст:».

На стороне настройки есть такая функция:

private static TemplateField GetTemplateColumn(string sColName)
    {
        TemplateField templateField = new TemplateField();

        templateField.HeaderTemplate = new CustomColumnDefiner(ListItemType.Header, sColName);
        templateField.ItemTemplate = new CustomColumnDefiner(ListItemType.Item, sColName);

        return templateField;
    }

затем в вашем коде страницы aspx позади.

myGridView.Columns.Add(GetTemplateColumn("Age"));

Я использовал этот метод, чтобы подчинить GridViews моей воле. Это будет работать для перехода от таблицы данных к HTML-таблице, которую вы хотите. Будет ли это соответствовать вашему общему решению, я не знаю.

0 голосов
/ 21 мая 2012

Я столкнулся с той же проблемой, что и вы.

После некоторых поисков я нашел способ сделать то, что вы хотите. Он не идеален, поскольку требует определения элемента управления + шаблона для каждого столбца (пример, который вы приводите, определяет шаблон непосредственно), но он работает.

//define a new property "Columns" in the grid
//it will hold a collection of controls of type "TemplatedColumn"
public class Grid : WebControl
{
    private ColumnsCollection _columnsCollection;
    public virtual ColumnsCollection Columns
    {
        get
        {
            if (_columnsCollection == null)
               _columnsCollection = new ColumnsCollection();
            return _columnsCollection;
        }
    } 
}

//define ColumnsCollection class (must implement IList)
public class ColumnsCollection : List<TemplatedColumn>  { ... }

//define TemplatedColumn webcontrol (in this case, must have a template)
public TemplatedColumn : WebControl
{ 
    private ITemplate _Template;

    [...] //attributes
    public ITemplate Template
    {
        get { return _Template; }
        set { _Template = value; }
    }
}

Тогда вы можете сделать:

   <cc:Grid runat="server">
     <Columns>
         <cc:TemplatedColumn runat="server">
            <Template>ID: <%# Eval("ID") %></Template>
         </cc:TemplatedColumn>
         <cc:TemplatedColumn runat="server">
            <Template>Name: <%# Eval("Name") %></Template>
         </cc:TemplatedColumn>
     <Columns>
   </cc:Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...