问题描述
我在数据库中有这样的数据
Empcode Date Status
123. 01-01-2021. P
123. 02-01-2021. P
123. 03-01-2021. P
. .
. .
123. 31-01-2021. P
我想要这样的数据
Dates 1 2 3 4 5 6 7 8 9 10 .....31
Empcode p p p a a p p a p p .......p
你能帮帮我吗 提前致谢。
解决方法
好的,这并不需要太多代码。诀窍是减少格式和标记。
所以,将一个网格控件放到一个表单中,像这样说:
<div style="width:60%;margin-top:10px;margin-left:10px">
<asp:GridView ID="GridView1" runat="server" CssClass="table table-hover"></asp:GridView>
</div>
所以,现在,在页面加载时,我们有以下代码:
Public MyTable As New DataTable
Public dtStart,dtEnd As Date
Public DaysInMonth As Integer
Protected Sub Page_Load(ByVal sender As Object,ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
CreateTable()
LoadGrid()
End If
End Sub
注意我是如何在表单(类)级别创建开始/结束变量的 - 以后可能需要这些!!!
所以,我们的创建表代码是这样的: (一个月,但第一列是 EmpID
Sub CreateTable()
Dim dt As Date = Date.Today
DaysInMonth = Date.DaysInMonth(Year(dt),Month(dt))
dtStart = DateSerial(Year(dt),Month(dt),1)
dtEnd = DateAdd(DateInterval.Day,DaysInMonth - 1,dtStart)
MyTable.Columns.Add("EmpID",GetType(Integer))
For I = 1 To DaysInMonth
MyTable.Columns.Add(I.ToString,GetType(String))
MyTable.Columns(I.ToString).DefaultValue = "a"
Next
End Sub
我们也在上面确实将默认值设置为“a”(不存在),因为当然当月的任何非数据都应该是“a”。
所以,现在我们要做的就是将查询拉入一个表中,然后将其发送到上表中。
该代码是这样的:
Sub LoadGrid()
Dim strSQL As String = "SELECT EmpID,ADate from tblAttend " &
"WHERE Adate between @dtStart AND @dtEnd " &
"ORDER BY EmpID,ADate "
Using cmdSQL As New SqlCommand(strSQL,New SqlConnection(My.Settings.TEST4))
cmdSQL.Connection.Open()
cmdSQL.Parameters.Add("@dtStart",SqlDbType.Date).Value = dtStart
cmdSQL.Parameters.Add("@dtEnd",SqlDbType.Date).Value = dtEnd
Dim rstEdata As New DataTable
rstEdata.Load(cmdSQL.ExecuteReader)
' now send data to our grid table
Dim dPtr As Integer ' day pointer
Dim EmpID As Integer = 0
Dim newRow As DataRow = Nothing
For Each OneRow As DataRow In rstEdata.Rows
If OneRow("EmpID") <> EmpID Then
' start of new employee
If EmpID <> 0 Then
MyTable.Rows.Add(newRow) ' add existing working row
End If
newRow = MyTable.NewRow ' start a new row
EmpID = OneRow("EmpID")
newRow("EmpID") = EmpID
End If
dPtr = Day(OneRow("ADate"))
newRow(dPtr) = "P"
Next
' send last row
MyTable.Rows.Add(newRow)
' send our data to the grid
GridView1.DataSource = MyTable
GridView1.DataBind()
End Using
End Sub
现在上面是一些代码 - 但不是那么多。
假设这个数据表:
现在我们的输出是这样的:
所以,在无标记旁边。
关键概念是创建一个数据表,然后将数据处理到该表中,然后非常容易显示 - 我们只需将表绑定/发送到 gridview。