This is a migrated thread and some comments may be shown as answers.

Hierarchical Grid Cannot Find Column [ColumnName]

1 Answer 180 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Aaron Gravois
Top achievements
Rank 1
Aaron Gravois asked on 21 Jun 2011, 04:53 PM
I have a grid that was working fine, but I wanted to add a detail table to it.  When I did, it stopped working.  It's saying that it can't find a column that I am 100% sure exists.  I'm using an ObjectDataSource that returns an IList to bind the detail table with.  Is there something I'm missing?

<%@ Page Title="" Language="C#" MasterPageFile="~/AppMasterPage.master" AutoEventWireup="true" CodeFile="Research.aspx.cs" Inherits="MoneyOrder_Research" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
 
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
    <center>
        <table>
            <tr>
                <td style="color:Blue;font-size:large"><strong>Money Order Research</strong><br /></td>
            </tr>
            <tr>
                <td><asp:Label ID="errorLabel" runat="server" Font-Bold="True" Font-Size="Large"
                        Font-Underline="True" ForeColor="#990000"></asp:Label><br /></td>
            </tr>
        </table>
    </center>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <telerik:RadScriptManager ID="RadScriptManager1" runat="server">
    </telerik:RadScriptManager>
    <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">       
        <AjaxSettings>
            <telerik:AjaxSetting AjaxControlID="moGrid">
                <UpdatedControls>
                    <telerik:AjaxUpdatedControl ControlID="moGrid" LoadingPanelID="RadAjaxLoadingPanel1" />                       
                </UpdatedControls>
            </telerik:AjaxSetting>             
        </AjaxSettings>       
    </telerik:RadAjaxManager>
    <telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" Skin="WebBlue" />   
    <telerik:RadGrid ID="moGrid" runat="server" OnNeedDataSource="moGrid_NeedDataSource" ShowStatusBar="true" AllowFilteringByColumn="true" ShowFooter="true"
            AutoGenerateColumns="False" PageSize="15" AllowSorting="True" AllowPaging="True" GridLines="Vertical" ShowHeader="true" ShowGroupPanel="true"
            Skin="WebBlue" AlternatingItemStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center"
            FilterItemStyle-HorizontalAlign="Center" GroupingSettings-CaseSensitive="false">
        <ClientSettings AllowDragToGroup="True">       
        </ClientSettings>        
        <MasterTableView DataKeyNames="ID,Location" HierarchyLoadMode="Client">             
            <DetailTables>           
                <telerik:GridTableView Name="histTable" DataKeyNames="ID,Location,MOID,MOLoc" DataSourceID="histSource" AutoGenerateColumns="true">
                    <ParentTableRelation>
                        <telerik:GridRelationFields DetailKeyField="MOID" MasterKeyField="ID" />
                        <telerik:GridRelationFields DetailKeyField="MOLoc" MasterKeyField="Location" />
                    </ParentTableRelation>                   
                </telerik:GridTableView>
            </DetailTables
        <SortExpressions>
            <telerik:GridSortExpression FieldName="DateAdd" SortOrder="Descending" />
        </SortExpressions>
            <Columns>
                <telerik:GridBoundColumn SortExpression="ID" HeaderText="ID" HeaderButtonType="TextButton" FilterDelay="8000" CurrentFilterFunction="EqualTo" Aggregate="Count"
                    DataField="ID" UniqueName="MO_ID" AutoPostBackOnFilter="false" ShowFilterIcon="false" AllowFiltering="true"></telerik:GridBoundColumn>                                           
                <telerik:GridTemplateColumn SortExpression="Location" HeaderText="Location" HeaderButtonType="TextButton" FilterDelay="8000" CurrentFilterFunction="EqualTo"
                    DataField="Location" UniqueName="MO_Location" GroupByExpression="Location Group By Location"  AutoPostBackOnFilter="false" ShowFilterIcon="false" AllowFiltering="true">
                    <ItemTemplate>
                        <asp:Label ID="MOLocationLbl" runat="server" Text='<%# Eval("Location") %>'></asp:Label>
                    </ItemTemplate>
                    <FilterTemplate>
                        <telerik:RadComboBox ID="locBox" runat="server" DataSourceID="locationSource" AppendDataBoundItems="true" Width="90px"
                            SelectedValue='<%# ((GridItem)Container).OwnerTableView.GetColumn("MO_Location").CurrentFilterValue %>'
                            OnClientSelectedIndexChanged="SelectedLocIndexChanged" >
                            <Items>
                                <telerik:RadComboBoxItem runat="server" Text="All Locations" Value="" />
                            </Items>
                        </telerik:RadComboBox>
                        <telerik:RadScriptBlock ID="locFilterScript" runat="server">
                            <script type="text/javascript">
                                function SelectedLocIndexChanged(sendrer, args) {
                                    var tableView = $find("<%# ((GridItem)Container).OwnerTableView.ClientID %>");
                                    tableView.filter("MO_Location", args.get_item().get_value(), "EqualTo");
                                }
                            </script>                               
                        </telerik:RadScriptBlock>
                    </FilterTemplate>
                </telerik:GridTemplateColumn>                                           
                <telerik:GridBoundColumn SortExpression="ACROrder" HeaderText="Order #" HeaderButtonType="TextButton" FilterDelay="8000" CurrentFilterFunction="EqualTo"
                    DataField="ACROrder" UniqueName="MO_ACROrder" AutoPostBackOnFilter="false" ShowFilterIcon="false" AllowFiltering="true"></telerik:GridBoundColumn>                                                           
                <telerik:GridBoundColumn SortExpression="Amount" HeaderText="Amount" HeaderButtonType="TextButton" FilterDelay="8000" DataField="Amount" Aggregate="Sum"
                    UniqueName="MO_Amount" AutoPostBackOnFilter="false" ShowFilterIcon="true" AllowFiltering="true" DataFormatString="{0:C}"></telerik:GridBoundColumn>                                                                           
                <telerik:GridTemplateColumn SortExpression="Status" HeaderText="Status" GroupByExpression="Status Group By Status" HeaderButtonType="TextButton" FilterDelay="8000" CurrentFilterFunction="EqualTo"
                    DataField="Status" UniqueName="MO_Status" AutoPostBackOnFilter="false" ShowFilterIcon="false" AllowFiltering="true">
                    <ItemTemplate>
                        <asp:Label ID="MOStatusLabel" runat="server" Text='<%# Eval("StatusText") %>'></asp:Label>
                    </ItemTemplate>
                    <FilterTemplate>
                        <telerik:RadComboBox ID="statusFilter" runat="server" DataSourceID="statusSource" DataTextField="Text" DataValueField="Value" Width="90px"
                            AppendDataBoundItems="true" SelectedValue='<%# ((GridItem)Container).OwnerTableView.GetColumn("MO_Status").CurrentFilterValue %>'
                            OnClientSelectedIndexChanged="SelectedStatusIndexChanged">
                            <Items>
                                <telerik:RadComboBoxItem runat="server" Text="All Statuses" Value="" />
                            </Items>
                        </telerik:RadComboBox>
                        <telerik:RadScriptBlock ID="filterStatusScriptBlock" runat="server">
                            <script type="text/javascript">
                                function SelectedStatusIndexChanged(sender, args) {
                                    var tableView = $find("<%# ((GridItem)Container).OwnerTableView.ClientID %>");
                                    tableView.filter("MO_Status", args.get_item().get_value(), "EqualTo");
                                }
                            </script>
                        </telerik:RadScriptBlock>
                    </FilterTemplate>
                </telerik:GridTemplateColumn>
                <telerik:GridTemplateColumn SortExpression="SuspActivityFlag" GroupByExpression="SuspActivityFlag Group By SuspActivityFlag" HeaderText="Suspicous" HeaderButtonType="TextButton" FilterDelay="8000" CurrentFilterFunction="EqualTo"
                    DataField="SuspActivityFlag" UniqueName="MO_SuspActivityFlag" AutoPostBackOnFilter="false" ShowFilterIcon="false" AllowFiltering="false">
                    <ItemTemplate>
                            <asp:LinkButton ID="MOSuspActlbl" runat="server" Text='<%# Eval("SuspActivityFlag").ToString() == "Y" ? "Yes" : "No" %>'
                                ForeColor='<%# Eval("SuspActivityFlag").ToString() == "Y" ? System.Drawing.Color.Maroon : System.Drawing.Color.Black %>' URL='<%# Eval("suspLink") %>' OnClientClick="PopUp(this.URL);"></asp:LinkButton>
                        <telerik:RadScriptBlock ID="popupScript" runat="server">
                            <script type="text/javascript">
                                function PopUp(URL) {                                   
                                    if (URL != '') {
                                        day = new Date();
                                        id = day.getTime();
                                        window.open(URL, id, 'toolbar=1,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=850,height=700,left = 62,top = 15')
                                    }
                                }
                            </script>
                        </telerik:RadScriptBlock>
                    </ItemTemplate>
                </telerik:GridTemplateColumn>              
                <telerik:GridTemplateColumn SortExpression="LogID" HeaderText="Log ID" GroupByExpression="LogID Group By LogID" HeaderButtonType="TextButton" FilterDelay="8000" CurrentFilterFunction="EqualTo"
                    DataField="LogID" UniqueName="MO_LogID" AutoPostBackOnFilter="false" ShowFilterIcon="true" AllowFiltering="true">
                    <ItemTemplate>
                        <asp:LinkButton ID="logLink" runat="server" Text='<%# Convert.ToInt32(Eval("LogID")) == -1 ? "N/A" : Eval("LogID") %>'
                            URL='<%# Eval("LogLink") %>' OnClientClick="PopUp(this.URL);"></asp:LinkButton>
                    </ItemTemplate>   
                </telerik:GridTemplateColumn>                                                           
                <telerik:GridBoundColumn SortExpression="UserName" HeaderText="User" HeaderButtonType="TextButton" FilterDelay="8000" CurrentFilterFunction="Contains"
                    DataField="UserName" UniqueName="MO_UserName" AutoPostBackOnFilter="false" ShowFilterIcon="false" AllowFiltering="true"></telerik:GridBoundColumn>                                                           
                <telerik:GridBoundColumn SortExpression="DateAdd" HeaderText="Date" HeaderButtonType="TextButton" FilterDelay="8000" DataField="DateAdd"
                    UniqueName="MO_DateAdd" AutoPostBackOnFilter="false" ShowFilterIcon="true" AllowFiltering="true" DataFormatString="{0:MM/dd/yyyy hh:mm tt}"></telerik:GridBoundColumn>                                                           
            </Columns>
        </MasterTableView>
    </telerik:RadGrid>
    <asp:ObjectDataSource ID="statusSource" runat="server" SelectMethod="GetStatuses"
        TypeName="MO.Business.Defaults">
    </asp:ObjectDataSource>
    <asp:ObjectDataSource ID="locationSource" runat="server" SelectMethod="GetLocations"
        TypeName="MO.Business.Defaults">
    </asp:ObjectDataSource>
    <asp:ObjectDataSource ID="histSource" runat="server" SelectMethod="GetHistory"
        TypeName="MO.Business.Research"></asp:ObjectDataSource>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder3" Runat="Server">
</asp:Content>

I keep getting Cannot Find Column [MOID].  The stack trace looks like this:

[EvaluateException: Cannot find column [MOID].]
   System.Data.NameNode.Bind(DataTable table, List`1 list) +1173813
   System.Data.BinaryNode.Bind(DataTable table, List`1 list) +31
   System.Data.UnaryNode.Bind(DataTable table, List`1 list) +29
   System.Data.BinaryNode.Bind(DataTable table, List`1 list) +31
   System.Data.UnaryNode.Bind(DataTable table, List`1 list) +29
   System.Data.DataExpression.Bind(DataTable table) +59
   System.Data.DataExpression..ctor(DataTable table, String expression, Type type) +4833511
   System.Data.DataView.set_RowFilter(String value) +153
   System.Data.LinqDataView.set_RowFilter(String value) +53
   Telerik.Web.UI.GridEnumerableFromDataView.PerformTransformation() +405
   Telerik.Web.UI.GridEnumerableFromDataView.TransformEnumerable() +21

Thanks,
Aaron

1 Answer, 1 is accepted

Sort by
0
Iana Tsolova
Telerik team
answered on 24 Jun 2011, 07:51 AM
Hi Aaron,

When RadGrid is bound through the NeedDataSource event, you should handle the DetailTableDataBind event to bind the detail tables. In this case you do not have to set any parent relations.
If you want to use the parent table relations, and to bind the nested grid views using declarative DataSource control, you should bing the grid (MasterTableView) using DataSource control as well.
Find more information on both approaches for binding a hierarchical grid in the below articles:
http://www.telerik.com/help/aspnet-ajax/grid-hierarchical-data-binding-using-detailtabledatabind.html
http://www.telerik.com/help/aspnet-ajax/grid-hierarchical-data-binding-using-needdatasource.html

Check it out and let me know how it goes.

All the best,
Iana
the Telerik team

Browse the vast support resources we have to jump start your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.

Tags
Grid
Asked by
Aaron Gravois
Top achievements
Rank 1
Answers by
Iana Tsolova
Telerik team
Share this question
or