We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy.
Unfortunately, activation email could not send to your email. Please try again.

Data Grid mapping to xaml with List of Dictionaries as the ItemsSource collection

Thread ID:

Created:

Updated:

Platform:

Replies:

125388 Aug 12,2016 03:30 AM Aug 22,2017 06:26 AM Xamarin.Forms 17
loading
Tags: SfDataGrid
Harsha
Asked On August 12, 2016 03:30 AM

Hi

Could you please tell how to bind sfdatagrid to xaml Xamarin MVVM approach when the item source is a List of dictionaries?

A sample project or example would be really helpful.

Thanks
Harsha Kandalam

Harsha
Replied On August 12, 2016 03:51 AM

Forgot to mention..

how to display items in the grid if the columns aren't known at compile time

Dharmendar Dhanasekar [Syncfusion]
Replied On August 15, 2016 01:21 AM

Hi Harsha,

Thanks for contacting Syncfusion Support.

Regarding “To set a Dictionary as the ItemsSource of the SfDataGrid”, it is not possible as the dictionary provides only two properties Key and Value which will be considered as the MappingName for the SfDataGrid columns. Hence only two columns will be created when a dictionary is set as itemssource to the SfDataGrid. 

With regard to“Displaying items in the grid when we columns arent known at compile time”. Xamarin.Forms do not have a support to Dynamic binding. Hence it is not supported in SfDataGrid. Please refer to the below link for further details.

Bugzilla link: https://bugzilla.xamarin.com/show_bug.cgi?id=37071  

Regards,
Dharmendar
 


Beej
Replied On June 23, 2017 03:12 AM

In case helpful for others searching here... binding to Collection<Dictionary<,>> can be accomplished but doesn't appear to be well documented... this WPF SfDataGrid doc gave clue.

The basic trick is to set the SfDataGrid's column.MappingName = "Fields[FieldName]";

     where Fields is a Dictionary property on your List


I couldn't get List<Dictionary<string, object>> working directly without the wrapper class "hiding" the dictionary from what I think is an SfDataGrid bug. The app crash exception call stack ultimately winds up on an invalid Linq related get_Item() call.


Below is sample working code including "SimpleTable" wrapper for List and Newtonsoft type converter for deserializing Json "table" directly into this datastructure.


FYI, I believe there is also a bug with SfDataGrid column sorting logic when bound to this kind of Dictionary, a non-fatal exception fires. I worked around by implementing grid.SortColumnsChanging.


Sample Deserialize call:

var data = "[{\"Source\":\"Web\",\"Batch Id\":1}, {\"Source\":\"Manual\",\"Batch Id\":2}]";

var table = JsonConvert.DeserializeObject<SimpleTable>(data);


Binding sample with crucial MappingName syntax:


grid.ItemsSource = table;

grid.Columns.Add(new GridTextColumn()

{

  HeaderText = "Source",

  MappingName = "Vals[Source]" // **** HERE'S THE KICKER ****

});


SimpleTable.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Newtonsoft.Json;


namespace DataHelpers

{

  [JsonConverter(typeof(DictRow_DictDeserializer))]

  public class DictRow

  {

    public Dictionary<string, object> Vals { get; set; }

    public DictRow(Dictionary<string, object> dict) { Vals = dict; }

  }


  public class SimpleTable : List<DictRow>

  {

    public SimpleTable(IEnumerable<DictRow> list) : base(list) { }

  }


  public class DictRow_DictDeserializer : JsonConverter

  {

    public override bool CanRead => true;

    public override bool CanWrite => false;

    public override bool CanConvert(Type objectType) => objectType == typeof(Dictionary<string, object>);


    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)

    {

      return new DictRow(serializer.Deserialize<Dictionary<string, object>>(reader));

    }


    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

    {

      throw new NotSupportedException();

    }

  }

}  


Ashok N [Syncfusion]
Replied On June 27, 2017 02:31 PM

Hi Beej, 
 
We are preparing the sample for Knowledge Base with sorting using Dictionary and we will update the KB link here, once KB was published in online. We appreciate your patience until then. 
 
Regards, 
Ashok 


kishor
Replied On July 24, 2017 01:20 AM

I am also interested in "sample for Knowledge Base with sorting,grouping,filtering,etc". Please suggest date to get this available,if you can.


Suhasini  Suresh [Syncfusion]
Replied On July 25, 2017 09:44 AM

Hi Beej, 
 
Thanks for your patience. 
 
The Knowledge base for loading dynamic items in datagrid is published with enable Sorting and Grouping. Please find the Knowledge base link for your requirement below: 
 
 
Regards, 
Suhasini 


Suhasini  Suresh [Syncfusion]
Replied On July 25, 2017 09:45 AM

Hi Kishor, 
 
Already we have published Knowledge base for loading dynamic items in datagrid with enable Sorting and Grouping. Please find the Knowledge base link for the same below: 
 
 
In the below sample we have enable the Filtering also using SfDataGrid.View.Filter property to achieve your requirement. 
 
 
Regards, 
Suhasini 


Beej
Replied On July 25, 2017 01:19 PM

Thanks for the sample! The need for GridQueryableCollectionViewWrapper looks to be very enlightening.

FYI for other folks copying this code, the JsonConverter approach in the code I provided looks to save an extra iteration through the rows of Json data vs the PopulateData method in the Syncfusion sample.


Ashok N [Syncfusion]
Replied On July 26, 2017 03:01 PM

Hi Beej, 
 
Thanks for you update. We will check and change the code for avoiding extra iteration if needed, also we will modify the KB sample.   
 
Regards, 
Ashok 


kishor
Replied On July 31, 2017 09:28 AM

Thanks. It work great for filter, group, sort but did not work with following1) All groups are by default expanded. i cannot play with expand and collapse feature?  [work great if we set AllowGroupExpandCollapse = true;]2) How can we apply grouping on multiple columns for example in  GridWithJSONData-2047590529 group on FirstName and then on LastName3) how can i show summary of certain column in Column and Row? 4) Conditional formatting?5) Pull to refresh? [Working great]6) Column Drag, Drop, hide ?7) Exporting?8) Freeze Panes?In short how can we achieve all features on data grid. if it is not possible for all in that case which are those we can implement and how?

Ashok N [Syncfusion]
Replied On August 1, 2017 02:31 PM

Hi Kishor, 
 
We regard to inform you that Xamarin.Forms do not have a support for Dynamic binding, so we can’t able to provide all SfDataGri feature support for dynamic collection. We will provide all support in our SfDataGrid after Xamarin.Forms support the dynamic collection. 
 
Regards, 
Ashok  


Beej
Replied On August 3, 2017 04:14 PM

Kishor, for conditional formatting, did you see the Conditional Styles example?

and otherwise using GridTemplateColumn we can completely customize the content & format of every cell based on our desired logic

do those cover what you're trying to accomplish with regards to conditional formatting or perhaps you could elaborate a little further?

Along these lines, beyond simply implementing OnAutoGeneratingColumn which exposes basic text column styling properties... we've had good success with implementing our own "auto generating columns" functionality which then applies various logic based content and formatting ... as a tip into this approach, we disabled the native autogenerate and trigger our logic via "OnPropertyChanged" looking for PropertyName == "ItemSource"... and then loop over the ((SimpleTable)ItemSource)[0].Vals.Keys to know what columns we wish to add to the SfDataGrid.Columns collection.

i can't offer insight for your other needs regarding grouping and such, as i have not explored that far myself yet.

i encourage you to press on with the support folks on the forum here. i've found that asking different ways and suggesting potential approaches will lead them to disclose further enlightenment about what might indeed work... this thread on how to bind to a list of dictionaries, which started out to the contrary, is a perfect example.

best of luck to you

Vimal Prabhu Manohkaran [Syncfusion]
Replied On August 4, 2017 04:08 PM

Hi Kishor,

As Beej stated, you can achieve your requirement of conditional styling and column template customizations through the links he had directed. However regarding your query please refer the below UG links to achieve your requirements,

1. GroupExpandCollapse : https://help.syncfusion.com/xamarin/sfdatagrid/grouping#expand-groups-while-grouping
2. MultiColumnGrouping : Currently not available in grid. You can expect the feature to be available in any of our upcoming releases post 2017 Vol 3 Main Release
 
3. Summary of columns : https://help.syncfusion.com/xamarin/sfdatagrid/summary
4. Conditional Formatting : As Beej stated, https://help.syncfusion.com/xamarin/sfdatagrid/conditional-styles
5. PullToRefresh : https://help.syncfusion.com/xamarin/sfdatagrid/pull-to-refresh
6. Column DragAndDrop : https://help.syncfusion.com/xamarin/sfdatagrid/columndraganddrop
7. Exporting : https://help.syncfusion.com/xamarin/sfdatagrid/exporting
8. FreezePanes : https://help.syncfusion.com/xamarin/sfdatagrid/freeze-panes

We will also be publishing a sample with all features of datagrid included shortly via a KB document.

Regards,
Vimal Prabhu


kishor
Replied On August 14, 2017 06:08 AM

Thanks...

Please find below my remarks. Only 7 No point is throwing exception, rest we can achieve....

1. GroupExpandCollapse : Done. work great if we set AllowGroupExpandCollapse = true;
2. MultiColumnGrouping : Ok
3. Summary of columns : Done
4. Conditional Formatting : Done
5. PullToRefresh : Done
6. Column DragAndDrop : Done
7. Exporting : throws exception as explain below
8. FreezePanes : Done

But throws exception for Exporting feature. I have use code snapshot to export in excel same as give in
https://help.syncfusion.com/xamarin/sfdatagrid/exporting.but it throws exception as "Unhandled Exception:
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: firstRow or lastRow occurred"

Please guide me on this.

Vimal Prabhu Manohkaran [Syncfusion]
Replied On August 15, 2017 08:40 AM

Hi Kishor,

Thanks for the update. We have prepared a sample based on your requirements by loading a List of Dictionaries as ItemsSource for SfDataGrid with exporting to PDF and Excel support provided via button click and we were not able to experience any crash. Please refer the sample from the below link to check and overcome the reported crash.

Sample Link : http://www.syncfusion.com/downloads/support/forum/125388/ze/SfDataGridTest-379781147

Regards,
Vimal Prabhu
 


kishor
Replied On August 16, 2017 03:19 AM

Thanks. Please check attached sample where you will get the mentioned issue. I have crossed check your provided sample this work great but for my sample it crashes.


Attachment: Export_To_Excel_7ab80814.rar

Ashok N [Syncfusion]
Replied On August 22, 2017 06:26 AM

Hi Kishor,  
  
Thanks for your update.  
  
We are able to reproduce the reported issue while exporting our SfDataGrid with TableSummary. Fix for this issue will be available in our 2017 Vol 3 SP1 release. Which will be schedule for rolls out end of August 2017. We appreciate your patience until then.  
  
Regards,  
Ashok  


CONFIRMATION

This post will be permanently deleted. Are you sure you want to continue?

Sorry, An error occured while processing your request. Please try again later.

You are using an outdated version of Internet Explorer that may not display all features of this and other websites. Upgrade to Internet Explorer 8 or newer for a better experience.

;