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

[Solved] Binding Grid Problem

1 Answer 230 Views
GridView
This is a migrated thread and some comments may be shown as answers.
This question is locked. New answers and comments are not allowed.
Omer Emre Aktepe
Top achievements
Rank 1
Omer Emre Aktepe asked on 21 Aug 2009, 12:42 PM
Hello i want to bind RadGrid by DataTable. My Wcf Service Convert DataTable to Xml String and my SL application gets Xml string and binds with the methods that I wrote below. i can bind grid very well. but when i click column header to sort or click filter pop up menu button or grouping event, application crash and give below error.

How can i solve these problems

Thanks

Omer Emre AKTEPE
Software Engineer

(Note: Sayi is my datatable column name)
Error:

Message: Sys.InvalidOperationException: ManagedRuntimeError error #4004 in control 'Silverlight1': System.ArgumentException: Invalid property or field - 'Sayi' for type: XElement 
   at Telerik.Windows.Data.Expressions.MemberAccessTokenExtensions.CreateMemberAccessExpression(IMemberAccessToken token, Expression instance) 
   at Telerik.Windows.Data.Expressions.ExpressionFactory.MakeMemberAccess(Expression instance, String memberName) 
   at Telerik.Windows.Data.Expressions.ExpressionFactory.MakeMemberAccess(Expression instance, String memberName, Boolean liftMemberAccessToNull) 
   at Telerik.Windows.Data.Expressions.PropertyAccessExpressionBuilder.CreateMemberAccessExpression() 
   at Telerik.Windows.Data.Expressions.MemberAccessExpressionBuilderBase.CreateLambdaExpression() 
   at Telerik.Windows.Data.Expressions.GroupDescriptorExpressionBuilder.CreateGroupByExpression() 
   at Telerik.Windows.Data.Expressions.GroupDescriptorExpressionBuilderBase.CreateQuery() 
   at Telerik.Windows.Data.Expressions.GroupDescriptorCollectionExpressionBuilder.CreateQuery() 
   at Telerik.Windows.Data.QueryableExtensions.GroupBy(IQueryable source, GroupDescriptorCollection groupDescriptors) 
   at Telerik.Windows.Data.QueryableCollectionView.CreateView() 
   at Telerik.Windows.Data.QueryableCollectionView.get_QueryableView() 
   at Telerik.Windows.Data.QueryableCollectionView.CreateInternalList() 
   at Telerik.Windows.Data.QueryableCollectionView.get_InternalList() 
   at Telerik.Windows.Data.QueryableCollectionView.GetEnumerator() 
   at Telerik.Windows.Data.RecordFactory.<CreateRecordsForGroupRecord>d__0.MoveNext() 
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
   at Telerik.Windows.Controls.GridView.GridViewDataControl.PopulateRecords() 
   at Telerik.Windows.Controls.GridView.GridViewDataControl.LoadData() 
   at Telerik.Windows.Controls.GridView.GridViewDataControl.OnCollectionViewCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) 
   at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) 
   at Telerik.Windows.Data.QueryableCollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) 
   at Telerik.Windows.Data.QueryableCollectionView.RefreshAndRaiseCollectionChanged(NotifyCollectionChangedEventArgs args) 
   at Telerik.Windows.Data.QueryableCollectionView.Refresh() 
   at Telerik.Windows.Data.QueryableCollectionView.EndDefer() 
   at Telerik.Windows.Data.QueryableCollectionView.DeferHelper.Dispose() 
   at Telerik.Windows.Controls.GridView.GridViewDataControl.PerformGrouping(String member, Object displayContent, Nullable`1 insertionIndex) 
   at Telerik.Windows.Controls.GridView.GridViewDataControl.<>c__DisplayClass2a.<GroupingRequested>b__29() 
   at Telerik.Windows.Controls.CursorManager.PerformTimeConsumingOperation(FrameworkElement frameworkElement, Action action) 
   at Telerik.Windows.Controls.GridView.GridViewDataControl.GroupingRequested(Object origin, GroupingRequestedEventArgs e) 

MyBind Method
public static bool Bind(Telerik.Windows.Controls.RadGridView grd, string DataTable) 
        { 
            XDocument xd = XDocument.Parse(DataTable); 
            if (xd.Root != null
            { 
                IEnumerable<XElement> nds = (xd.Root.FirstNode as XElement).Elements(); 
                XMLConverter cnv = new XMLConverter(); 
                foreach (XElement node in nds) 
                { 
                    GridViewDataColumn clmn = new GridViewDataColumn(); 
                    Binding bnd = new Binding(); 
                    bnd.ConverterParameter = node.Name.LocalName; 
                    bnd.Converter = cnv; 
 
                    clmn.DataMemberBinding = bnd; 
                    clmn.IsReadOnly = true
                    clmn.UniqueName = node.Name.LocalName; 
                    clmn.DataType = typeof(System.String); 
                    grd.Columns.Add(clmn); 
                } 
                var query = 
                     (from el in xd.Elements("DocumentElement"
                      from el1 in el.Elements("Tablo"
                      select el1).ToList(); 
                grd.AutoGenerateColumns = false
 
                grd.ItemsSource = query; 
                return true
            } 
            return false
        } 


Binding.Converter 
public class XMLConverter : IValueConverter 
    { 
        public object Convert(object value, Type targetType    object parameter, CultureInfo culture) 
        { 
            if (value is XElement) 
            { 
                XElement row = value as XElement; 
                string index = parameter as string; 
                return row.Element(index).Value; 
            } 
            return null; 
        } 
 
        public object ConvertBack(object value, Type targetType, 
            object parameter, CultureInfo culture) 
        { 
            throw new NotImplementedException(); 
        } 
    } 


1 Answer, 1 is accepted

Sort by
0
Stefan Dobrev
Telerik team
answered on 26 Aug 2009, 02:07 PM
Hello Omer,

Currently we did not support native binding to XElements. What you can do is to create a custom object that have the needed properties. Then in your LINQ query you will have to create new instances of this custom object. Something like this:
from element in document.Descendants("OrderDetails"
select new OrderDetail 
    Discount = float.Parse(element.Descendants("Discount").First().Value, CultureInfo.InvariantCulture.NumberFormat), 
    OrderID = int.Parse(element.Descendants("OrderID").First().Value), 
    ProductID = int.Parse(element.Descendants("ProductID").First().Value), 
    Quantity = short.Parse(element.Descendants("Quantity").First().Value), 
    UnitPrice = decimal.Parse(element.Descendants("UnitPrice").First().Value, CultureInfo.InvariantCulture.NumberFormat) 

Sincerely yours,
Stefan Dobrev
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
Tags
GridView
Asked by
Omer Emre Aktepe
Top achievements
Rank 1
Answers by
Stefan Dobrev
Telerik team
Share this question
or