关于c#:如何将网格视图绑定到复杂对象

how to bind the grid view to complex object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class BE_RoomRateService
{
    public IQueryable<RoomRateWithRoomType> RoomRateForAdmin()
    {
                var query= from rate in db.BE_RoomRates
                           join room in db.BE_Rooms
                           on rate.RoomId equals room.RoomId
                           where rate.Status!=3 && room.Status!=3
                           select new RoomRateWithRoomType()
                           {
                               RoomRate = rate,
                               RoomType = room.RoomType

                           };
                return query;
     }
}

public class RoomRateWithRoomType
{
            public BE_RoomRate RoomRate { get; set; }
            public string RoomType { get; set; }
}

这里,当我想用这个方法结果和这个代码绑定我的网格时,RoomRateForAdmin现在返回RoomRateWithRoomType的集合。

1
2
grdData.DataSource = bs.RoomRateForAdmin();
grdData.DataBind();

然后它给了我错误:BussinessLogic.Data.RoomRateWithRoomType"不包含名为"SingleRate"的属性。

因为网格视图的ASPX页面如下所示:

2

我知道我不能直接得到RoomRate表的属性,但是我不知道如何得到BE_RoomRate类的属性。

我的问题可能看起来非常大,因为我不知道如何直接问它,所以任何人都会编辑这个问题,以获得我的观点在小版本。


如果你想订单人房的话。然后就不用了

1
Eval("SingleRate")

使用

1
DataBinder.Eval(Container.DataItem,"RoomRate.SingleRate")

请参阅这个小示例(代码隐藏)

2

ASPX:

1
2
3
4
5
6
7
8
9
10
        <Columns>
           
            <HeaderTemplate>
                Major</HeaderTemplate>
            <ItemTemplate>
                '></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        </Columns>
    </asp:GridView>

因为datakeynames属性是字符串而不是表达式,所以我建议您为此创建一个属性。所以你的物体看起来像这样:

1
2
3
4
5
6
public class RoomRateWithRoomType
{
      public BE_RoomRate RoomRate { get; set; }
      public string RoomType { get; set; }
      public int RoomRateId { get; set; }
}

然后在网格中可以使用:

1
DataKeyNames="RoomRateId"

要避免每行调用一个数据库,请更改此项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public IQueryable<RoomRateWithRoomType> RoomRateForAdmin()
{
            var query= from rate in db.BE_RoomRates
                       join room in db.BE_Rooms
                       on rate.RoomId equals room.RoomId
                       where rate.Status!=3 && room.Status!=3
                       select new RoomRateWithRoomType()
                       {
                           RoomRate = rate,
                           RoomType = room.RoomType

                       };
            return query;
 }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public IEnumerable<RoomRateWithRoomType> RoomRateForAdmin()
        {
                    var query= from rate in db.BE_RoomRates
                               join room in db.BE_Rooms
                               on rate.RoomId equals room.RoomId
                               where rate.Status!=3 && room.Status!=3
                               select new RoomRateWithRoomType()
                               {
                                   RoomRate = rate,
                                   RoomType = room.RoomType

                               };
                    return query.ToList();
         }


我认为您在这里的最佳选择是返回一个包含绑定网格所需的所有属性的对象(可以是匿名的)。