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. Image for the cookie policy date

How would you bind jason data to a sfData grid and populate the grid

here is my jason get request populating a custom list view

public class RootObject
    {

        public List<Feed> Feeds { getset; }
    }

    public class Channel
    {
        public int Id { getset; }
        public string Name { getset; }
        public string Description { getset; }
        public string Latitude { getset; }
        public string Longitude { getset; }
        public string Field1 { getset; }
        public DateTime Created_at { getset; }
        public DateTime Updated_at { getset; }
        public string Elevation { getset; }
        public int Last_entry_id { getset; }
    }

    public class Feed
    {
        public DateTime Created_at { getset; }
        public int Entry_id { getset; }
        public string Field1 { getset; }
    }


    public partial class DripPage : TabbedPage
    {
        void Handle_Refreshing(object sender, System.EventArgs e)
        {
            postsListView.ItemsSource = _data;
            postsListView.EndRefresh();
        }

        private const string Url = "https://thingspeak.com/channels/301726/field/1.json";
        private HttpClient _client = new HttpClient();
        private ObservableCollection<Feed> _data;

    
        public DripPage()
        {
            InitializeComponent();
        }

        protected override async void OnAppearing()
        {
            var content = await _client.GetStringAsync(Url);
            var data = JsonConvert.DeserializeObject<RootObject>(content);

            _data = new ObservableCollection<Feed>(data.Feeds);
            postsListView.ItemsSource = _data;

    
            base.OnAppearing();
        }

        void OnAdd(object sender, System.EventArgs e)
        {
        }

        void OnUpdate(object sender, System.EventArgs e)
        {
        }

        void OnDelete(object sender, System.EventArgs e)
        {
        }
    }
}

3 Replies

DS Divakar Subramaniam Syncfusion Team September 29, 2017 07:33 AM UTC

Hi Carlo, 
 
Thanks for contacting Syncfusion support. 
 
In SfDataGrid, JSON data cannot bound directly. To bind SfDataGrid with JSON data, you need to deserialize the JSON data to the bindable format. Please refer the below KB link to know how to deserialize the JSON data and bound it to SfDataGrid, 
 
Also, we have prepared a sample by binding JSON data to SfDataGrid and you can download the same from the below link, 
 
Regards, 
Divakar. 



CC Carlo Chan September 29, 2017 01:15 PM UTC

hi, thanks for replying syncfusion! 

I have already deserialized my data however keep getting error after error when trying to use the sfdatagrid with my json data and its getting quite frustrating. I am pretty new to xamarin so maybe thats why. But ive had a look at your documentation regarding but it shows local, and im not sure i quite understand the json sln you sent me. If possible could you guys try and get one going atleast start it off for me.  Thanks


Here is the data im trying to collect and populate onto the sfdata grid  just using the feeds 

public class RootObject
    {

        public List<Feed> Feeds { getset; }
    }

    public class Channel
    {
        public int Id { getset; }
        public string Name { getset; }
        public string Description { getset; }
        public string Latitude { getset; }
        public string Longitude { getset; }
        public string Field1 { getset; }
        public DateTime Created_at { getset; }
        public DateTime Updated_at { getset; }
        public string Elevation { getset; }
        public int Last_entry_id { getset; }
    }

    public class Feed
    {
        public DateTime Created_at { getset; }
        public int Entry_id { getset; }
        public string Field1 { getset; }
    }


    public partial class DripPage : TabbedPage
    {
        void Handle_Refreshing(object sender, System.EventArgs e)
        {
            postsListView.ItemsSource = _data;
            postsListView.EndRefresh();
        }

        private const string Url = "https://thingspeak.com/channels/301726/field/1.json";
        private HttpClient _client = new HttpClient();
        private ObservableCollection<Feed> _data;

    
        public DripPage()
        {
            InitializeComponent();
        }

        protected override async void OnAppearing()
        {
            var content = await _client.GetStringAsync(Url);
            var data = JsonConvert.DeserializeObject<RootObject>(content);

            _data = new ObservableCollection<Feed>(data.Feeds);
            postsListView.ItemsSource = _data;

    
            base.OnAppearing();
        }

        void OnAdd(object sender, System.EventArgs e)
        {
        }

        void OnUpdate(object sender, System.EventArgs e)
        {
        }

        void OnDelete(object sender, System.EventArgs e)
        {
        }
    }
}



VP Vimal Prabhu Manohkaran Syncfusion Team October 2, 2017 12:09 PM UTC

Hi Carlo,

Thanks for the update. Could you please let us know what you are doing with the deserialized JSON data ? In our sample provided in the previous response,

1. We first deserialize the JSON data and store it in a collection as shown below.
 
public ObservableCollection<DynamicModel> DynamicCollection { get; set; } 
 
DynamicJsonCollection = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(JsonData); 
 

2. Then we fetch each item from the deserialized JSON data and add it to the collection that we bind as the ItemsSource for the grid.


 
 
public ObservableCollection<DynamicModel> DynamicCollection { get; set; } 
 
DynamicCollection = PopulateData(); 
 
private ObservableCollection<DynamicModel> PopulateData() 
{ 
            var data = new ObservableCollection<DynamicModel>(); 
            foreach (var item in DynamicJsonCollection) 
            { 
                var obj = new DynamicModel() { Values = item }; 
                data.Add(obj); 
            } 
            return data; 
} 
                 
 
 
3. By doing the above we will now be able to store a dictionary of items in the collection we bind as the ItemsSource for the grid. Then now we bind each item in the dictionary as the MappingNames for each of the columns and thus the data is rendered . So the key is to convert the desirialized objects into a collection and bind it to the grid. Here the collection we have binded is a collection of dictionaries. Please refer the below code snippet to know how to populate each column.

 
grid.ItemsSource = viewModel.DynamicCollection; 
grid.Columns.Add(new GridTextColumn() 
{ 
  HeaderText = "Order ID", 
  MappingName = "Values[OrderID]", 
}); 
 

Could you please follow this step by step approach and let us know if this works. Also could you please share more details on what errors you are facing when trying to implement the same.

Regards,
Vimal Prabhu
 


Loader.
Live Chat Icon For mobile
Up arrow icon