2015-12-13 5 views
0

Это смысл продолжения of this question. Но, чтобы быть точным, я объясняю, что я хочу делать. Я разработал веб-приложение, которое позволяет пользователю управлять рабочими днями (я называю это рабочим планом), теперь я разрабатываю клиентское приложение для синхронизации локальных данных в веб-базе данных. Поэтому я должен иметь полную совместимость со всей информацией о данных от клиента в Интернете. Дно код просто создать workingPlan для конкретного пользователя, это workingPlan в JsonFormat, результат в том, что я хочу достичь, как это:Невозможно преобразовать String в свойство класса

"monday":{ 
"start":"09:00", 
"end":"18:00", 
"breaks":[ 
{ 
"start":"11:20", 
"end":"11:30" 
}, 
{ 
"start":"14:30", 
"end":"15:00" 
} 
] 
}, 
"tuesday":{ 
"start":"09:00", 
"end":"18:00", 
"breaks":[ 
{ 
"start":"11:20", 
"end":"11:30" 
}, 
{ 
"start":"14:30", 
"end":"15:00" 
} 
] 
}, 

Как вы можете видеть каждый день имеет start и end рабочее время. Кроме того, в каждый день у меня может быть несколько разрывов, это для разделения рабочего слота. Теперь json, закодированный сверху, является строкой, генерируемой PHP, а json, сгенерированный в vb.net, является результатом заполнения DateTimePicker. По сути то, что мне нужно сделать, это ревалоризировать разрывы, теперь я добавляю перерывы в DataGrid, например:

enter image description here

Окончательный формат JSON будет (для этого конкретного случая):

{"monday":{"start":"09:00","end":"18:00","breaks":[{"start":"19:30","end":"19:50"},{"start":"21:40","end":"21:30"}]},"tuesday":{"start":null,"end":null,"breaks":[{"start":null,"end":null},{"start":"14:30","end":"15:00"}]},"wednesday":{"start":"09:00","end":"18:00","breaks":[{"start":"19:37","end":"19:50"}... 

класс для управления Week, BreaksDay так оБЪЯВЛЕННЫХ:

Public Class WorkDay   

    <JsonProperty("start")> 
    Public Property starttime As String 
    <JsonProperty("end")> 
    Public Property endtime As String 
    Public Property breaks As Break() 

End Class 

Public Class Break    

    <JsonProperty("start")> 
    Public Property starttime As String 
    <JsonProperty("end")> 
    Public Property endtime As String 

End Class 

Public Class WorkWeek   

    Public Property monday As WorkDay 
    Public Property tuesday As WorkDay 
    Public Property wednesday As WorkDay 
    Public Property thursday As WorkDay 
    Public Property friday As WorkDay 
    Public Property saturday As WorkDay 
    Public Property sunday As WorkDay 

    Public Sub New() 
     monday = New WorkDay 
     tuesday = New WorkDay 
     wednesday = New WorkDay 
     thursday = New WorkDay 
     friday = New WorkDay 
     saturday = New WorkDay 
     sunday = New WorkDay 
    End Sub 

End Class 

Теперь, ревалоризировать перерывы каждый день я итерацию по этому DataGrid

For Each row As DataGridViewRow In User.break_view.Rows 

       If Not row.IsNewRow Then 

        If row.Cells(0).Value.ToString = "Monday" Then 

         workWeek.monday.breaks = row.Cells(1).Value.ToString 'Incriminated line 

        End If 

       ... each day condition 

       End If 

      Next 

на этой workWeek.monday.breaks = row.Cells(1).Value.ToString линии я получаю эту ошибку:

Can't convert String into Users.Break()

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

+0

Это связано с тем, что разрывы свойств определяются как «Break». Мы не можем назначить напрямую. вы можете попробовать что-то вроде workWeek.monday.breaks = new Break(), за которым следует workWeek.monday.breaks.starttime = row.Cells (1) .value.ToString – Baskar

+1

Я получаю starttime не является членом Break – Dillinger

ответ

1

Во-первых, вы должны изменить Breaks декларацию:

Public Property breaks As New List(Of Break) 

Как показано в ответе. Тогда, так как это List(of Break) вам нужно будет добавить новые объекты Break к нему:

For Each row As DataGridViewRow In User.break_view.Rows 
    ' ...or Exit For since it is always the last one: 
    If row.IsNewRow Then Continue For 

    Dim brk As new Break  ' create a New Break object 
    Brk.starttime = row.Cells(1).Value.ToString 
    Brk.endtime = row.Cells(2).Value.ToString  '?? 

    ' figure where to add it 
    Select Case row.Cells(0).Value.ToString.ToLowerInvariant 
     Case "sunday" 
      ' WorkWeek is a Type, avoid using type names as variables: 
      myWorkWeek.sunday.Breaks.Add(brk) 
     Case "monday" 
      myWorkWeek.monday.Breaks.Add(brk) 
     ... 
    End Select 
Next 

Поскольку же JSON имеет несколько разрывов, должно было бы быть больше петли где-то. Но это будет просто добавлено (просто не уверен, откуда). Если вы использовали форму словаря, вы можете избавиться от оператора case, используя в качестве ключа row.Cells(0).

Если перерыв должны были изменить (как вы собираетесь найти эти ?), Вы можете сделать, как в вашем коде:

myWrkWeek.friday.Breaks(0).starttime = "08:15" 
myWrkWeek.friday.Breaks(0).endtime = "17:55" 

Вы также можете ускорить путем добавления starttime и endtime в качестве параметров к конструктору Break.Поскольку нет причин для того, чтобы один из них существовал без начала и остановки, это имеет смысл. Но поскольку источником являются ячейки DGV, он не будет выглядеть более четким в коде.

Если это на самом деле что-то похожее на приложение табель, вы, вероятно, хотите что-то вроде Multiple In/Out раза в течение каждого дня, то этот класс может иметь свойство, которое возвращает TimeSpan дает общее суммарное время.

+1

Теперь я ' m на мобильном телефоне, поэтому я не могу попробовать код, но он кажется хорошим, как всегда. Спасибо, случай - хороший выход, я просто пришла на ум. – Dillinger

Смежные вопросы