不使用 Eval 的 GridGroupHeaderItem.AggregatesValues

5

telerik文档中,它说聚合值存储在AggregatesValues中。他们甚至在示例中使用它。

但我发现这是不可能证明的。因为一切都是真实的,直到被证明是错误的,对吧?
让我提供一个最小、完整、可验证的示例。这样你就可以指出我的错误。

Aspx:

<telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource" AllowPaging="True" ShowGroupPanel="True">
    <MasterTableView>
        <GroupByExpressions>
            <telerik:GridGroupByExpression>
                <SelectFields>                       
                    <telerik:GridGroupByField FieldAlias="GrpGroupID1" FieldName="GroupID" />
                    <telerik:GridGroupByField FieldAlias="SumCount" FieldName="Count" Aggregate="Sum" />
                </SelectFields>
                <GroupByFields>
                    <telerik:GridGroupByField FieldAlias="GrpGroupID" FieldName="GroupID" HeaderText="" />
                </GroupByFields>
            </telerik:GridGroupByExpression>
        </GroupByExpressions>
        <GroupHeaderTemplate>
            <table>
                <tr>
                    <td>eval GrpGroupID1:</td>
                    <td><%# Eval("GrpGroupID1") %></td>
                    <td> ||| </td>
                    <td>Bind GrpGroupID1:</td>
                    <td><%# ((GridGroupHeaderItem)Container).AggregatesValues["GrpGroupID1"] %></td>
                </tr>
                <tr>
                    <td>eval SumCount:</td>
                    <td><%# Eval("SumCount") %></td>
                    <td> ||| </td>
                    <td>Bind SumCount:</td>
                    <td><%# ((GridGroupHeaderItem)Container).AggregatesValues["SumCount"] %></td>
                </tr>
            </table>
        </GroupHeaderTemplate>
        <Columns>
            <telerik:GridNumericColumn DataField="ID" HeaderText="ID" SortExpression="ID" UniqueName="Name_ID" />
            <telerik:GridNumericColumn DataField="GroupID" HeaderText="GroupID" SortExpression="GroupID" UniqueName="Name_GroupID" />
            <telerik:GridBoundColumn DataField="Name" HeaderText="Name" SortExpression="Name" UniqueName="Name_Name" />
            <telerik:GridBoundColumn DataField="Text" HeaderText="Text" SortExpression="Text" UniqueName="Name_Text" />                
            <telerik:GridNumericColumn DataField="Count" HeaderText="Count" SortExpression="Count" UniqueName="Name_Count" Aggregate="Sum" />
        </Columns>
    </MasterTableView>

</telerik:RadGrid>

后台代码:

protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
    List<TmpType> myData = new List<TmpType>();

    List<string> firstNames = new List<string>() { "Angela", "Pamela", "Sandra", "Rita", "Monica", "Erica", "Tina", "Mary", "Jessica", "Loubega" };
    List<string> Location = new List<string>() { "Reunion", "Paris", "Bretagne", "Madagascar", "UK", "Maurice" };
    Random random = new Random();

    for (int i = 0; i <= 88; i++)
    {
        TmpType row = new TmpType();
        row.ID = i + 1;
        row.GroupID = random.Next(10);
        row.Count = random.Next(10);
        row.Name = firstNames[random.Next(firstNames.Count)];
        row.Text = Location[random.Next(Location.Count)];
        myData.Add(row);
    }
    RadGrid1.DataSource = myData;
}

class TmpType
{
    public string Name { get; set; }
    public string Text { get; set; }
    public int Count { get; set; }
    public int GroupID { get; set; }
    public int ID { get; set; }
}

结果:

调试中聚合值的键和值:

Key and values of AggregatesValues in debug

数据显示的例子: 数据显示的例子

正如您在这个例子中看到的:
- Eval("SumCount") 可以找到值
当:
- ((GridGroupHeaderItem)Container).AggregatesValues["SumCount"] 失败时!

文档说:

当前组中项目的总合计值的字段别名。

SumCount 是我的 FieldAlias。

我尝试的:

以下是我尝试过的每一件事情及其结果。

Eval() : 总是几乎正确,近乎一切知识的近似值。

  1. Eval("GrpGroupID1")给出分组字段的当前值,OK!
  2. Eval("SumCount")给出聚合函数的正确结果,OK!
  3. Eval("Count")给出此分组的行数值(4),不符合预期。
  4. Eval("Name_Count")错误,因为这不是任何属性,OK!

AggregatesValues: 它将非常快!

  1. ((GridGroupHeaderItem)Container).AggregatesValues["GrpGroupID1"]给出分组字段的当前值,OK!

  2. 其他所有内容返回 NULL

这些测试使用了 asp:Label 而不是 Label。

附注:

  • 是的,我可以简单地使用Eval。但为什么?MSDN为什么说不要使用它,而Telerik文档则表示我可以使用聚合值集合。

问题在哪里?

许多人会问:“问题在哪里?”
我如何在不使用EvalBind的情况下获取这个GridGroupHeaderItem.AggregatesValues


如果您将<%# Eval("SumCount") %>添加到某个标签的Text中会怎样? - M. Wiśnicki
在我的代码中,我有<td><%# Eval("SumCount") %></td>。我可以将其放入标签文本中,但我不明白这样做的意义。结果将是相同的,它们都会给出正确的结果。 - Drag and Drop
好的,你是否尝试使用FieldName而不是FieldAlias?((GridGroupHeaderItem)Container).AggregatesValues["Count"] - M. Wiśnicki
这个是空的,我已经尝试了每种列名、列字段、GridGroupByField FieldAlias、GridGroupByField Name,甚至在最后一步使用HeaderText。明天我会更新一个包含所有可能性以及Eval和AggregatesValues结果的表格。 - Drag and Drop
尝试将数据绑定表达式作为服务器控件的属性,如先前所述。在演示中就是这样做的。 <asp:Label runat="server" ID="Label1" Text="<%# Eval("SumCount") %>" /> - Seano666
正如你所预期的使用ASp:Label并没有改变数据绑定的行为。Eval和The AggregatesValues仍然保持不变。我已经更新了问题,并列出了我的尝试清单。 - Drag and Drop
1个回答

1
"Name_GroupID"缺少"Aggregate"属性,该属性可以填充聚合值集合。虽然Eval()已经可以访问绑定的值,但是聚合集合仍然为空,导致出现null值。
请尝试在列中添加"Aggregate='Sum'"。
<telerik:GridNumericColumn DataField="GroupID" HeaderText="GroupID" SortExpression="GroupID" UniqueName="Name_GroupID" Aggregate="Sum" />

结果:

聚合值的键和值在调试中:

enter image description here enter image description here

数据展示的例子:

enter image description here

非常赞赏您所提供的详细信息!调查这个案件非常愉快!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接