var supervisorSummary = Persons.GroupBy(p => p.SupervisorName)
.Select(group => new { Name = group.Key,
Count = group.Count() })
.OrderBy(x => x.Name).ToList();
此查询完美返回Name和Count。我将此输出绑定到GridView并在两列上实现了排序。然后我意识到Count在GridView中被视为String而不是Integer。
有没有办法在Gridview中为BoundField指定数据类型?
<asp:GridView ID="gvSupervisorSummary" runat="server" AutoGenerateColumns="False" EnableViewState="False" AllowSorting="true" OnSorting="gvSupervisorSummary_Sorting"
BackColor="White" BorderColor="#cccccc" BorderStyle="None" BorderWidth="1px" CellPadding="2"
EmptyDataText="No person found." GridLines="none" Width="100%">
<AlternatingRowStyle BackColor="#ededed" />
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="Count" HeaderText="Direct Reports Count" SortExpression="Count"/>
</Columns>
我转换为DataView并绑定到网格,以使我的排序更具动态性。
DataView dv = new DataView(DataManager.ToDataTable(supervisorSummary));
dv.Sort = SortExpression;
gvSupervisorSummary.DataSource = dv;
gvSupervisorSummary.DataBind();
我的排序表达式定义为
private string SortExpression { get { if (Session["SCSortExpression"] == null) Session["SCSortExpression"] = "Count ASC"; return Session["SCSortExpression"].ToString(); } set { Session["SCSortExpression"] = value; } }
答案 0 :(得分:0)
这里没有任何动态。匿名类型不是动态对象。这是一个强类型的对象,你没有给出一个名字。编译器只是推断出类型并为你创建它,但你不能用这种类型做任何动态的事情。
如果要命名返回的类型,可以执行此操作,但不会更改GridView
正在执行的操作。
class MyGroup {
public string Name { get; set; }
public int Count { get; set; }
}
var supervisorSummary = Persons.GroupBy(p => p.SupervisorName)
.Select(group => new MyGroup { Name = group.Key,
Count = group.Count() })
.OrderBy(x => x.Name).ToList();
虽然这似乎不是真正的问题。你不期待GridView
做什么?
答案 1 :(得分:0)
Count()始终返回int值。因此,Linq查询中的Return对象的类型也将是int类型。
请检查GridView绑定和列数据类型。
但是,仍然有一种方法可以通过类型转换来指定查询中的类型。 供您参考:
var supervisorSummary = Persons.GroupBy(p => p.SupervisorName)
.Select(group => new
{
Name = group.Key,
Count =(Int64)group.Count(),
})
.OrderBy(x => x.Name).ToList();
这样,Count的类型将很长。(而不是int)。 但是,您不能将此类型转换从string应用于int。
请提供您的网格视图绑定代码。
答案 2 :(得分:0)
似乎我搞砸了这个问题。实际上,它不是Linq或Gridview的问题。
这是我的DataTable转换中的问题。
我有以下代码来创建列而不指定数据类型。
dataTable.Columns.Add(prop.Name);
我把它改成了下面,它工作正常
dataTable.Columns.Add(prop.Name, prop.PropertyType);