Отображать изображения в столбце DataGridView, используя объекты JSON в качестве источника данных

У меня была аналогичная проблема. В моем случае никогда не было проблемой сдуть все в репозитории heroku и заменить его тем, что находится в моем подкаталоге. Если это ваш случай, вы можете использовать следующий сценарий bash. Просто поставьте его в свой каталог приложений Rails.

#!/bin/bash

#change to whichever directory this lives in
cd "$( dirname "$0" )"

#create new git repository and add everything
git init
git add .
git commit -m"init"
git remote add heroku git@heroku.com:young-rain-5086.git

#pull heroku but then checkback out our current local master and mark everything as merged
git pull heroku master
git checkout --ours .
git add -u
git commit -m"merged"

#push back to heroku, open web browser, and remove git repository
git push heroku master
heroku open
rm -fr .git

#go back to wherever we started.
cd -

Я уверен, что есть много способов улучшить это - так что не стесняйтесь рассказывать мне, как это сделать!

1
задан Jimi 16 January 2019 в 06:13
поделиться

2 ответа

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

Вы можете сделать это в свойствах этого представления данных ИЛИ программно, когда вы создаете представление данных и добавляете в него свои столбцы:

 Dim imgColumn as new DataGridViewImageColumn
 DataGridView1.Columns.Add(imgColumn)

Как только вы добавили столбец / изменили тип столбца, который можно затем преобразовать в каждую ячейку в этом столбце в растровое изображение:

Это может выглядеть примерно так (замените colindex порядковым номером столбца вашего изображения, например, imgColumn мы заявлено выше):

 Dim currRow as Int = 0
 For Each row As DataGridViewRow In DataGridView1.Rows

            Dim img = new Bitmap(DataGridView1.Item(colindex, currRow).value);

            DataGridView1.Item(colindex, currRow).value = img

            currRow = currRow + 1


  Next

Ссылка здесь

0
ответ дан Malcolm Salvador 16 January 2019 в 06:13
поделиться

Примечание. Этот вопрос имеет продолжение здесь:
Копировать выбранные строки флажков из DGV в DGV2, включая столбец изображения


[ 1146] Вам необходимо загрузить изображения после десериализации JSON в объект вашего класса. Вы можете и добавить новое открытое свойство Type Bitmap во внутренний класс Result , который будет использоваться для представления изображения, на которое ссылается URI, найденный в JSON.

Чтобы получить Изображения, вам нужен метод, который берет URI ресурса и загружает его с удаленного компьютера. Я добавил открытый метод в класс Products , который ссылается на все объекты, содержащие ссылку на URI:
после того, как JSON был успешно проанализирован, [ 1110] Свойство будет ссылаться на все классы Result . Каждый класс Result будет ссылаться на битовый URI в свойстве ProductImage .

Используя класс WebClient , мы можем использовать эти ссылки для загрузки изображений и добавления их в свойство типа Bitmap.
Нам также нужно указать парсеру JSON игнорировать это свойство, так как оно не является частью объекта JSON.
Это можно сделать, добавив атрибут <JsonIgnore> к свойству.

Переименуйте RootObject (с именем JSON в определении вашего класса) в Root:

Кроме того, все классы, которые вы здесь показываете, добавляются в родительский класс с именем [ 1165] ProductsQuery , используется в качестве контейнера для всех объектов класса.

Public Class Root
   Public Property uk As Uk
End Class

Десериализовать JSON с помощью JsonConvert.DeserializeObject :

Dim JSONObject As String = File.ReadAllText("[Source Txt]")
Dim JsonPost As ProductsQuery.Root = JsonConvert.DeserializeObject(Of ProductsQuery.Root)(JSONObject)

Используйте недавно добавленный публичный метод для загрузки изображений:

JsonPost.uk.ghs.Products.LoadImages()

Подготовьте DataGridViewImageColumn , который покажет изображения:
Редактировать : также вставьте DataGridViewCheckBoxColumn .

Dim DGVCheckBoxCol As DataGridViewCheckBoxColumn = New DataGridViewCheckBoxColumn(False) With {
    .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader,
    .DisplayIndex = 0,
    .HeaderText = "",
    .Name = "Select"
}

Dim DGVImageCol As DataGridViewImageColumn = New DataGridViewImageColumn(False) With {
    .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader,
    .DataPropertyName = "Image",
    .DisplayIndex = 1,
    .FillWeight = 1,
    .HeaderText = "Image",
    .ImageLayout = DataGridViewImageCellLayout.Normal,
    .Name = "Image",
    .ValuesAreIcons = False
}

Затем установите DataGridView DataSource и скройте столбец, содержащий URI-код изображения, который здесь не очень полезен. Кроме того, вызовите метод AutoResizeRows , чтобы установить размер строк для лучшего представления изображения:

DataGridView1.DataSource = Nothing 
DataGridView1.Columns.Clear()

DataGridView1.Columns.Insert(0, DGVCheckBoxCol)
DataGridView1.Columns.Insert(1, DGVImageCol)
DataGridView1.DataSource = JsonPost.uk.ghs.Products.Results
DataGridView1.Columns(2).Visible = False
DataGridView1.AutoResizeRows()

Результат :

[1156 ] JSON on DataGridView

Модифицированные классы :

Примечание :
description свойство представляет собой массив строк, которые DGV отказывается показывать как есть. Я назвал его RawDescription и добавил новое свойство ( Description ) типа String - с атрибутом <JsonIgnore> - в Result класс, который будет содержать сплющенную строку.

Imports System.IO
Imports System.Net
Imports Newtonsoft.Json

Public Class ProductsQuery

    Public Class Root
        Public Property uk As Uk
    End Class

    Public Class Uk
        Public Property ghs As Ghs
    End Class

    Public Class Ghs
        Public Property products As Products
    End Class

    Public Class Products
        Public Property input_query As String
        Public Property output_query As String
        Public Property filters As Filters
        Public Property queryPhase As String
        Public Property totals As Totals
        Public Property config As String

        <JsonProperty("results")>
        Public Property Results As Result()
        Public Property suggestions As Object()

        Public Sub LoadImages()
            Using client As WebClient = New WebClient()
                For Each result As Result In Results
                    Dim bitmapBytes = client.DownloadData(result.ProductImage)
                    Using ms As MemoryStream = New MemoryStream(bitmapBytes)
                        ms.Position = 0
                        result.Image = CType(Image.FromStream(ms).Clone(), Bitmap)
                    End Using
                    result.ProductDescription = result.RawDescription(0)
                Next
            End Using
        End Sub
    End Class

    Public Class Filters
    End Class

    Public Class Totals
        Public Property all As Integer
        <JsonProperty("new")>
        Public Property NewProducts As Integer
        Public Property offer As Integer
    End Class

    Public Class Result

        <JsonIgnore>
        Public Property Image As Bitmap

        <JsonProperty("image")>
        Public Property ProductImage As String

        <JsonProperty("superDepartment")>
        Public Property SuperDepartment As String
        Public Property tpnb As Integer
        Public Property ContentsMeasureType As String

        <JsonProperty("name")>
        Public Property Name As String
        Public Property UnitOfSale As Integer

        <JsonIgnore>
        Public Property Description As String

        <JsonProperty("description")>
        Public Property RawDescription As String()
        Public Property AverageSellingUnitWeight As Double
        Public Property UnitQuantity As String
        Public Property id As Integer
        Public Property ContentsQuantity As Double

        <JsonProperty("department")>
        Public Property Department As String

        <JsonProperty("price")>
        Public Property Price As Double

        <JsonProperty("unitprice")>
        Public Property Unitprice As Double
    End Class
End Class
0
ответ дан Jimi 16 January 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: