Asp.NET ListView Data Control динамически привязывает данные - PullRequest
2 голосов
/ 23 декабря 2008

Я пытаюсь реализовать элемент управления данными 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. Как использовать Databinder.Eval для элементов ListView для вставки этого значения свойства.

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 23 декабря 2008

Хорошо, отвечая на ваши вопросы:

  • Вы можете перебирать элементы ListViewItems, используя событие OnItemDataBound в родительском ListView. Затем вы можете использовать это для привязки данных вложенных дочерних ListViews (или вставки Html или манипулирования содержимым списка любым удобным для вас способом). Убедитесь, что вы используете ListViewItemEventArgs в своем коде за обработчиком, чтобы вы могли легко получить доступ к элементу, связанному с данными ...
  • Вы можете использовать Databinder.Eval для динамического заполнения Repeater в вашем 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>
0 голосов
/ 10 марта 2010

Хорошо, я нахожу способ рендеринга повторителя внутри списка, я не знаю, смогу ли я вставить весь код, потому что он довольно длинный. Результат HTML, как показано ниже:


 <ul>
   <li>time1               
                         [comment: following is repeater inside listview]
   scenarioNamegroupName1groupName2
   S1g1Conc1g2Conc1
   S2g1Conc2g2Conc2
   S3g1Conc1g2Conc3
   
   </li>

   <li>time2
                         [comment: following is repeater inside listview]
   scenarioNamegroupName1groupName2
   S1g1Conc1g2Conc1
   S2g1Conc2g2Conc2
   S3g1Conc1g2Conc3
   
   </li>

   <li>time3
                         [comment: following is repeater inside listview]
   scenarioNamegroupName1groupName2
   S1g1Conc1g2Conc1
   S2g1Conc2g2Conc2
   S3g1Conc1g2Conc3
   
   </li>
 </ul>

Сложность в том, что номер группы может быть разным

моя страница 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 templateType; общедоступный MyTemplate (тип System.Web.UI.WebControls.ListItemType) { 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);
}

}

0 голосов
/ 23 декабря 2008

возможно, ваш ответ - привязать повторитель к элементу шаблона

и ретранслятор получит источник данных <% # Eval ("DataDictionary")%>.

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