Como exibir Duração apenas Horas: Minutos: Second em Gridview Asp.Net usando LINQ to SQL?
-
22-08-2019 - |
Pergunta
Eu quero mostrar a duração única horas, minutos, e Segundo em dados Gridview por Subtrair TimeCheckOut de TimeCheckIn em ASP.NET usando LINQ to SQL
Aqui está o código por trás:
Dim db = new MyDataContext
Dim user = from u in db.Employees select IDNumber = u.IDNumber, _
FirstName = u.firstName, LastName = u.lastName, TimeCheckIn = u.timeCheckIn, _
TimeCheckOut = u.timeCheckOut, Duration = u.timeCheckIn
Gridview1.DataSource = user
Gridview1.DataBind()
código na página:
<asp:GridView ID="GridView1" runat="server" Width="100%"
AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="IDNumber" HeaderText="ID Number" ReadOnly="True" />
<asp:BoundField DataField="FirstName" HeaderText="First Name" ReadOnly="True"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name" ReadOnly="True"/>
<asp:BoundField DataField="TimeCheckIn" HeaderText="Time Check In" ReadOnly="True"/>
<asp:BoundField DataField="TimeCheckOut" HeaderText="Time Check Out" ReadOnly="True" />
<asp:TemplateField HeaderText="Duration">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# FieldDisplayDuration(Eval("Duration")) %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Aqui está o meu ajudante para FieldDisplayDuration:
Protected Function FieldDisplayDuration(ByVal Duration As DateTime) As String
Dim rtn As String = "DefaultValue"
Dim dif As TimeSpan = DateTime.Now.Subtract(Duration)
rtn = dif.Hours & " hours, " & dif.Minutes & " minutes, " & dif.Seconds & " seconds. "
Return rtn
End Function
Na linha 3 na função de ajudante, Dim dif como TimeSpan = DateTime.Now.Subtract (Duração) que dão apenas a duração de hora, minuto e segundo da TimeCheckIn até DateTime.Now. No entanto, eu quero ter a duração de TimeCheckIn até TimeCheckOut apenas em hora, minuto e segundo. Eu sei que a função FieldDisplayDuration é lógica totalmente errado, mas eu só quero que você obter apenas o meu ponto, e também poderia ser o exemplo de código para aqueles que querem calcular a duração do empregado a partir da data de aluguer. Finalmente, Vamos voltar para TimeSpan por Subtrair TimeCheckOut de TimeCheckIn no problema gridview, Como posso fazer isso? Por favor me dê alguma pista .. Obrigado tanto ...
Solução
É possível apenas subtrair a data e hora para obter o Timespan por isso você deve ser capaz de usar
Text='<%# FieldDisplayDuration(Eval("TimeCheckIn"), Eval("TimeCheckOut")) %>'
e algo como esta função:
Protected Function FieldDisplayDuration(ByVal CheckIn As DateTime, ByVal CheckOut as DateTime) As String
Dim rtn As String = "DefaultValue"
Dim dif As TimeSpan = CheckOut - CheckIn
rtn = dif.Hours & " hours, " & dif.Minutes & " minutes, " & dif.Seconds & " seconds. "
Return rtnEnd
Function
Embora eu provavelmente usaria um formato de cadeia na linha rturn e fazer isso ...
rtn = string.Format("{0} hours, {1} minutes, {2} seconds.", dif.Hours, dif.Minutes, difSeconds)
Como eu acho que é mais fácil de ler.
Outras dicas
Você pode colocar a lógica para calcular o direito de duração em seu Select cláusula, assim:
Dim user = from u in db.Employees select IDNumber = u.IDNumber, _
FirstName = u.firstName, LastName = u.lastName, TimeCheckIn = u.timeCheckIn, _
TimeCheckOut = u.timeCheckOut, Duration = u.timeCheckOut.Subtract(u.timeCheckIn)
Em seguida, você só precisa formatar o Timespan resultante.
Como alternativa, você pode fazer tudo na seleção, ou mesmo chamar uma função, por isso, tem algo parecido
Duration = FormatDuration(u.timeCheckOut.Subtract(u.timeCheckIn)
ou
Duration = FormatDuration(u.timeCheckIn, u.timeCheckOut)\
Se você fez isso, e assumindo FormatDuration retornado uma string, você seria capaz de acabar com o modelo da coluna inteiramente