для каждого цикла, который генерирует мой datagridview/datatable?

#c# #json #datatable #datagridview

Вопрос:

Я уже несколько дней ломаю голову над этим, кажется, не могу понять, сколько бы примеров я ни пытался привести, кажется, что все они не доходят до того места, где я застрял.

У меня есть файл .json, который я deserialize ввел в класс ( Datum ToolData ), созданный quicktype.io я затем привязываю это datasource к своему datagridview(toolDataGridView)

на данный момент кажется, что каждый пример думает, что это прогулка в парке, и должен заполнить мой datagridview в несколько кликов, и это может быть. Просто мне не так-то просто это понять.

Моя единственная цель на данный момент-просто отобразить эти данные в формате excel. Первоначально эта информация отображалась в файле excel, который использовал PowerQuery для ввода данных в excel, но для загрузки данных потребовалось несколько минут. Я был доволен тем, что зашел так далеко, но я хочу продолжать учиться и заставить это работать. Я знаю, что не может быть намного больше, чтобы добраться туда, куда я пытаюсь добраться.

Вот код, который обрабатывает всю привязку и десериализацию, я считаю , что после привязки мне нужно выполнить какой-то foreach цикл, который фактически заполнит gridview , но у меня также есть ощущение, что у меня что-то не так настроено и что это gridview должно просто заполниться в этот момент. foreach Цикл в конце этого фрагмента кода не работает по какой-то причине, которую я пока не понимаю. но опять же, может быть, мне это даже не понадобится?

Код

 var loadscreen = new SplashScreen();  loadscreen.Show();  string myDynamicJSON = File.ReadAllText(@"testLibrary.json");    DataGridView ToolDataGridView = new DataGridView();  DataTable Tool = new DataTable();    Datum ToolData = JsonConvert.DeserializeObjectlt;Datumgt;(myDynamicJSON);   BindingSource SBind = new BindingSource();  SBind.DataSource = Tool;   toolDataGridView.AutoGenerateColumns = false;  toolDataGridView.DataSource = Tool;   toolDataGridView.DataSource = SBind;   foreach (string Description in ToolData)  {   }  

Ниже будет класс, на который я ссылался ранее в этом вопросе.

Code

 namespace QuickType { using System; using System.Collections.Generic;  using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Converters;   public partial class TestLibrary {  [JsonProperty("data")]  public Datum[] Data { get; set; }   [JsonProperty("version")]  public long Version { get; set; } }  public partial class Datum {  [JsonProperty("BMC")]  public Bmc Bmc { get; set; }   //[JsonProperty("GRADE", NullValueHandling = NullValueHandling.Ignore)]  //public Grade? Grade { get; set; }   [JsonProperty("description")]  public string Description { get; set; }   [JsonProperty("geometry")]  public Geometry Geometry { get; set; }   [JsonProperty("guid")]  public Guid Guid { get; set; }   //[JsonProperty("holder", NullValueHandling = NullValueHandling.Ignore)]  //public Holder Holder { get; set; }   [JsonProperty("post-process")]  public PostProcess PostProcess { get; set; }   [JsonProperty("product-id")]  public string ProductId { get; set; }   [JsonProperty("product-link")]  public string ProductLink { get; set; }   [JsonProperty("start-values")]  public StartValues StartValues { get; set; }   [JsonProperty("type")]  public string Type { get; set; }   [JsonProperty("unit")]  public Unit Unit { get; set; }   [JsonProperty("vendor")]  public string Vendor { get; set; }   //[JsonProperty("last_modified", NullValueHandling = NullValueHandling.Ignore)]  //public long? LastModified { get; set; }   //[JsonProperty("reference_guid", NullValueHandling = NullValueHandling.Ignore)]  //public string ReferenceGuid { get; set; } } }  

and finally a snippet of my .json file I am deserializing:

Code

 { "data": [  {  "BMC": "carbide",  "GRADE": "Mill Generic",  "description": "5/8-11"",  "geometry": {  "CSP": false,  "DC": 0.433,  "HAND": true,  "LB": 2,  "LCF": 0.5,  "NOF": 4,  "NT": 1,  "OAL": 5,  "SFDM": 0.625,  "TP": 0.0909091,  "shoulder-length": 1.969,  "thread-profile-angle": 60  },  "guid": "0112c196-8a79-421d-8dda-d4aa964aa6d7",  "holder": {  "description": "Maritool CAT40-ER32-2.35",  "guid": "e800051b-e2d6-4699-a2b6-dad6466a0a0c",  "last_modified": 1485790626152,  "product-id": "CAT40-ER32-2.35",  "product-link": "",  "segments": [  {  "height": 0.148,  "lower-diameter": 1.5,  "upper-diameter": 1.97  },  {  "height": 0.836,  "lower-diameter": 1.97,  "upper-diameter": 1.97  },  {  "height": 0.176,  "lower-diameter": 1.57,  "upper-diameter": 1.57  },  {  "height": 0.09,  "lower-diameter": 1.57,  "upper-diameter": 1.75  },  {  "height": 0.425,  "lower-diameter": 1.75,  "upper-diameter": 1.75  },  {  "height": 0.05,  "lower-diameter": 1.75,  "upper-diameter": 1.85  },  {  "height": 0.03,  "lower-diameter": 2.442,  "upper-diameter": 2.502  },  {  "height": 0.145,  "lower-diameter": 2.502,  "upper-diameter": 2.502  },  {  "height": 0.079,  "lower-diameter": 2.502,  "upper-diameter": 2.215  },  {  "height": 0.118,  "lower-diameter": 2.215,  "upper-diameter": 2.215  },  {  "height": 0.079,  "lower-diameter": 2.215,  "upper-diameter": 2.502  },  {  "height": 0.143,  "lower-diameter": 2.502,  "upper-diameter": 2.502  },  {  "height": 0.03,  "lower-diameter": 2.502,  "upper-diameter": 2.442  },  {  "height": 0.125,  "lower-diameter": 1.75,  "upper-diameter": 1.75  }  ],  "type": "holder",  "unit": "inches",  "vendor": "Maritool"  },  "post-process": {  "break-control": false,  "comment": "",  "diameter-offset": 17,  "length-offset": 17,  "live": true,  "manual-tool-change": false,  "number": 17,  "turret": 0  },  "product-id": "GMDTTM58-11UN4FL",  "product-link": "6010",  "start-values": {  "presets": [  {  "description": "",  "f_n": 0.012242786571039,  "f_z": 0.0031,  "guid": "eac33213-4083-35b8-afe3-17bd42a249f0",  "n": 4410.76054758139,  "n_ramp": 44110,  "name": "1018",  "tool-coolant": "flood",  "use-stepdown": false,  "use-stepover": false,  "v_c": 499.9999999999994,  "v_f": 54.6934307900093,  "v_f_leadIn": 54,  "v_f_leadOut": 54,  "v_f_plunge": 54,  "v_f_ramp": 54  },  {  "description": "",  "f_n": 0.010769117817118,  "f_z": 0.0028,  "guid": "f35f5601-68a9-477b-b4b0-2ffeedb3bef1",  "n": 1764.3042190325598,  "n_ramp": 1764,  "name": "4140",  "tool-coolant": "flood",  "use-stepdown": false,  "use-stepover": false,  "v_c": 200,  "v_f": 19.7602072531647,  "v_f_leadIn": 19,  "v_f_leadOut": 19,  "v_f_plunge": 19,  "v_f_ramp": 19  },  {  "description": "",  "f_n": 0.012091641057817,  "f_z": 0.0031,  "guid": "b118ce46-da35-4ed6-9806-b98e05ffe077",  "n": 2646.45632854884,  "n_ramp": 2646,  "name": "Tool Steel",  "tool-coolant": "flood",  "use-stepdown": false,  "use-stepover": false,  "v_c": 300,  "v_f": 32.8160584740056,  "v_f_leadIn": 32,  "v_f_leadOut": 32,  "v_f_plunge": 32,  "v_f_ramp": 32  },  {  "description": "",  "f_n": 0.01118476797848,  "f_z": 0.0028,  "guid": "0e1767f5-b0ef-422f-b49d-6cb8c3eb06ed",  "n": 3308.0704106860494,  "n_ramp": 3308,  "name": "Stainless Steel",  "tool-coolant": "flood",  "use-stepdown": false,  "use-stepover": false,  "v_c": 375,  "v_f": 37.0503885996837,  "v_f_leadIn": 37,  "v_f_leadOut": 37,  "v_f_plunge": 37,  "v_f_ramp": 37  }  ]  },  "type": "thread mill",  "unit": "inches",  "vendor": "Gorilla Mill"  },  

Вот набор данных на картинке, чтобы показать столбцы введите описание изображения здесь

Ответ №1:

Вы создаете DataTable , но никогда ничем его не заполняете. Затем вы привязываете это к DataGridView , кроме того, вы устанавливаете DataSource несколько раз, перезаписывая предыдущее значение:

 //So you have an empty DataTable object  DataTable Tool = new DataTable();   //You got the data  Datum ToolData = JsonConvert.DeserializeObjectlt;Datumgt;(myDynamicJSON);  //You create a new BindingSource  BindingSource SBind = new BindingSource();  //You just set this to an empty DataTable  SBind.DataSource = Tool;   toolDataGridView.AutoGenerateColumns = false;   //What is the point of this? As you set it again in the next line?  toolDataGridView.DataSource = Tool;   toolDataGridView.DataSource = SBind;  

Я думаю, что вы хотите сделать, это заполнить DataTable перед выполнением какой-либо привязки, так что вы бы сделали:

 //You got the data Datum ToolData = JsonConvert.DeserializeObjectlt;Datumgt;(myDynamicJSON);  //So you have an empty DataTable object DataTable Tool = new DataTable();  //add columns Tool.Columns.Add("somecolumnname"); //etc..until done adding columns  foreach (string Description in ToolData.{someProperty}) {  //Populate the DataTable with rows of data  DataRow dr = Tool.NewRow();  // Fill the values  dr["somecolumnname"] = Description;  //maybe some other column values...    Tool.Rows.Add(dr); }  //Now you have a DataTable with something in it, do the binding: BindingSource SBind = new BindingSource(); SBind.DataSource = Tool; toolDataGridView.DataSource = SBind;  

Комментарии:

1. строка foreach выдает ошибку прямо сейчас, исчезнет ли это, если в таблице данных есть данные? кроме того, мне понадобится новое предисловие для каждого столбца правильно? Ошибка CS1579 Оператор foreach не может работать с переменными типа «Datum», поскольку «Datum» не содержит общедоступного экземпляра или определения расширения для «GetEnumerator»

2. теперь у меня есть 2 ошибки, та, что была раньше, плюс еще одна, говорящая, что DataTable не содержит определения для AddColumn. чего бы это ни стоило, у моей таблицы данных внутри набора данных уже есть столбцы, поэтому я не думаю, что мне нужно добавлять их сюда правильно? я пропустил этот кусочек..

3. @JoeFisher, Это моя вина. Вы можете запустить только a foreach на an IEnumerable , поэтому, поскольку я не уверен в том, что вы пытаетесь повторить в своем десериализованном объекте , вы бы ToolData заменили ToolData.{SomeIEnumerableProperty} также , это Tool.Columns.Add не Tool.AddColumn так, я торопился и набрал неверный текст. см.Обновленный ответ.

4. поэтому я изменил свой foreach на следующий, foreach (описание строки в ToolData. Описание), но теперь я не могу преобразовать тип char в строку. я погружаюсь в это, но так ли просто, как изменить тип tooldata.description в моем конструкторе наборов данных?

5. @JoeFisher ToolData.Description -это строка, повторение которой создает каждого человека char , вот почему она жалуется. Каковы ваши имена столбцов и чем вы хотите заполнить каждую строку в своем foreach ?