2017-05-22 60 views
-1

我已經反序列化並將我的JSON字符串轉換爲對象。JsonConvert對象到datagridview c#

我想知道如何將所有這些數據放入DataGridView

我搜索了論壇,但找不到合適的答案。下面是我有:

JSON:

{ 
    "name":"default", 
    "ramps":[ 
    { 
     "color":"deep_red", 
     "points": [ 
     {"time":0,"intensity":0}, 
     {"time":360,"intensity":0}, 
     /* MANY OTHER POINTS */ 
     {"time":1290,"intensity":0} 
     ] 
    }, 
    { 
     "color":"uv", 
     "points":[ 
     {"time":0,"intensity":0}, 
     /* MANY OTHER POINTS */ 
     {"time":1290,"intensity":0} 
     ] 
    }, 
    { 
     "color":"deep_blue", 
     "points":[ 
     {"time":0,"intensity":0}, 
     /* MANY OTHER POINTS */ 
     {"time":1320,"intensity":0} 
     ] 
    }, 
    /* MANY OTHER COLORS */ 
    ], 
    "response_code":0 
} 

類:

public class Prime 
{ 
    public string name { get; set; } 
    public ramps[] ramps { get; set; } 
    public int response_code { get; set; } 
} 

public class ramps 
{ 
    public string color { get; set; } 
    public points[] points { get; set; } 
} 

public class points 
{ 
    public int time { get;set;} 
    public int intensity { get; set;} 
} 

C#代碼:

if (response2.StatusCode == HttpStatusCode.OK) 
{  
    var arr = JsonConvert.DeserializeObject<Prime>(responseFromServer);  
    Dg_View.DataSource = arr; 
} 

不幸的是,上面的代碼沒有填滿DataGridViewDg_View )與任何數據。調試arr我可以看到正確格式的所有JSON。

我要color爲行名,time爲列標題,每個框中的值爲intensity

+0

歡迎來到StackOverflow。我編輯了你的問題,以減少巨大和不必要的代碼量。當你問,儘量簡化代碼儘可能簡化,沒有意義的是有200行全部重複和冗餘,這只是浪費時間的讀者。一個有用的閱讀:[如何創建一個最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve)。 –

+0

您有層次數據,因此您應該嘗試使用主/細節表單方法https://msdn.microsoft.com/en-us/library/y8c0cxey(v=vs.110).aspx(您至少需要兩個datagridView,一個用於斜坡,一個點) – caner

+0

看起來相當複雜..我很驚訝,沒有簡單的方法將數據發佈到一個對象的datagridview ..我設法做到這一點嵌套for循環時,數據是在XML格式。 –

回答

0

Prime對象(在上面的代碼中稱爲arr)將包含多個Ramps對象,因此,看起來每個「Ramps」對象都會有一個網格。該網格將有一列顯示每個Ramps對象的不同「顏色」。 由於每個Ramps對象可能包含多個Points對象,因此可以使用另一個網格爲第一個網格中選定的每個color顯示不同的timeintensityPoints

下圖展示了上述方法。左邊的網格顯示每個Ramps對象的不同'顏色屬性。右側的網格顯示左側網格中當前選定行的Points對象的不同timeintensity屬性。

如果用戶在左側的網格中選擇了不同的「顏色」,則右側的網格將更新以反映所選的color s Points

enter image description here

下面的代碼使用Prime類型的全局變量PrimeObject。它包含所有數據,需要對RampsSelectionChanged事件可見,以便使用Ramps網格中的選定顏色更新Points網格。當網格中的選擇更改時,將檢查有效的選定單元格,然後獲取所選單元格行索引以確定要在Points網格中顯示哪個Points

Prime PrimeObject; 

private void btnReadJson_Click(object sender, EventArgs e) { 
    try { 
    string json = File.ReadAllText(jsonFile); 
    PrimeObject = JsonConvert.DeserializeObject<Prime>(json); 
    dgvRamps.DataSource = PrimeObject.ramps; 
    lblColorGroup.Text = "Prime name: " + PrimeObject.name + " - Response Code: " + PrimeObject.response_code; 
    } 
    catch (Exception ex) { 
    MessageBox.Show("Error reading JSON file: " + jsonFile + Environment.NewLine + ex.Message); 
    } 
} 

private void dgvColor_SelectionChanged(object sender, EventArgs e) { 
    try { 
    if (dgvRamps.SelectedCells.Count > 0) { 
     int colorIndex = dgvRamps.SelectedCells[0].RowIndex; 
     dgvPoints.DataSource = PrimeObject.ramps[colorIndex].points; 
    } 
    } 
    catch (Exception ex) { 
    MessageBox.Show("SelectionChanged: Error: " + ex.Message); 
    } 
} 

希望這會有所幫助。

+0

我收到「對象引用未設置」行 dGview_points.DataSource = PrimeObject.ramps [colorIndex] .points; 似乎沒有找到PrimeObject對象。 –

+0

正如我在我的回答中所說'PrimeObject'需要是一個全局變量。 – JohnG

+0

我試着把這個添加到類的頂部,但它仍然給了我上面的錯誤。下面 代碼剪斷 - 命名空間AI_Prime { \t ///

\t /// MainForm中的描述。 \t /// \t \t公共部分類的MainForm:表格 \t { \t \t總理PrimeObject; Windows窗體設計器支持需要 \t \t公衆的MainForm() \t \t { \t \t \t // \t \t \t //在InitializeComponent()調用。 \t \t \t // \t \t \t InitializeComponent(); \t \t \t \t \t \t // \t \t \t // TODO:添加構造函數代碼在InitializeComponent()調用之後。 \t \t \t \t \t \t // \t \t} –