GridView MasterDetail-细节可以是不同的类型

时间:2018-12-20 09:42:29

标签: c# asp.net gridview master-detail

我想要一个GridView主从。

Detail中实体的类型可以是不同的类型(每个Master总是相同的类型,以及从同一基类继承的那些类型)

在“详细信息”中,我要具有BaseClass和派生类的属性,因此一个Master的“ Detail”可以具有与另一Master的“ Detail”不同的行数。

我想避免在codeBehind上生成列

我尝试了不同的细节,并通过使用嵌入式代码选择了一个,但是我无法与DataBinding表达式结合使用

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

...

我也尝试过将鉴别符保存在HiddenField中(确定)。然后在嵌入式代码中尝试访问该值,但是我不知道如何访问它

1 个答案:

答案 0 :(得分:0)

可以使用强类型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。现在,您可以轻松访问属性。

<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>