GridView MasterDetail - детали могут быть разных типов - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу GridView Master-Detail.

Тип сущности в детализации может быть разных типов (всегда один и тот же тип для мастера и типы, унаследованные от одного базового класса)

В детали я хочу иметьСвойства из BaseClass, а также из производного класса, поэтому у Detail на одном Master может быть разное количество строк, чем у Detail другого Master.

Я бы хотел избежать генерации столбцов в codeBehind

Я пытался с разными деталями и выбрать один с помощью встроенного кода, но я не могу объединить с выражениями привязки данных

<% if(Eval("Type").ToString() == "Type1") { %
    CodeOfDetailType1
<% }%>
<% if(Eval("Type").ToString() == "Type2") { %
    CodeOfDetailType2
<% }%>

...

Я также пытался сохранитьдискриминатор в скрытом поле (ОК).И затем во встроенном коде пытались получить доступ к этому значению, но я не знаю, хой, чтобы получить к нему доступ

1 Ответ

0 голосов
/ 20 декабря 2018

Это можно сделать с помощью строго типизированного GridView.Допустим, у вас есть следующие классы

public class MasterClass
{
    public SubClass1 subClass1 { get; set; }
    public SubClass2 subClass2 { get; set; }
}

public class SubClass1
{
    public int id { get; set; }
    public string name { get; set; }
}

public class SubClass2
{
    public int ID { get; set; }
    public string NAME { get; set; }
}

Затем создайте список из MasterClass и привяжите его к GridView

List<MasterClass> list = new List<MasterClass>();
list.Add(new MasterClass() { subClass1 = new SubClass1() { id = 1, name = "Name 1" } });
list.Add(new MasterClass() { subClass2 = new SubClass2() { ID = 2, NAME = "Name 2" } });

GridView1.DataSource = list;
GridView1.DataBind();

В GridView добавьте ItemType сполное NameSpace.Теперь вы можете легко получить доступ к свойствам.

<asp:GridView ID="GridView1" runat="server" ItemType="YourNameSpace.MasterClass">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>

                <%# Item.subClass1 != null ? Item.subClass1.id : Item.subClass2.ID %>
                <%# Item.subClass1 != null ? Item.subClass1.name : Item.subClass2.NAME %>     

            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
...