#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
на anIEnumerable
, поэтому, поскольку я не уверен в том, что вы пытаетесь повторить в своем десериализованном объекте , вы быToolData
заменилиToolData.{SomeIEnumerableProperty}
также , этоTool.Columns.Add
неTool.AddColumn
так, я торопился и набрал неверный текст. см.Обновленный ответ.4. поэтому я изменил свой foreach на следующий, foreach (описание строки в ToolData. Описание), но теперь я не могу преобразовать тип char в строку. я погружаюсь в это, но так ли просто, как изменить тип tooldata.description в моем конструкторе наборов данных?
5. @JoeFisher
ToolData.Description
-это строка, повторение которой создает каждого человекаchar
, вот почему она жалуется. Каковы ваши имена столбцов и чем вы хотите заполнить каждую строку в своемforeach
?