2015-01-19 5 views
1

내 제목은 여전히 ​​광범위하므로 여기에서 더 자세히 설명하겠습니다. 내 코드는 다음과 같습니다.적절한 루프를 사용하여 DataGrid에서 셀을 병합하고 빈 공간을 제거하는 방법

enter image description here .

하지만 이렇게 보이게하고 싶습니다. enter image description here.

사진에서 볼 수 있듯이 빈 공간을 제거하고 싶습니다. 추가 데이터를 선택한 경우 7 일을 더 선택했다고 가정 해 보겠습니다. 따라서 가로로 표시되지는 않습니다.

내 루프와 관련하여 문제가 있다고 생각합니다. 제가 일주일 동안 디버깅을 해왔으므로 트레이스를 도울 수 있기를 바랍니다. (. 신경 끄시 내 긴 쿼리, 난 그냥 나 또한 쉽게 디버깅에 대한 의견을 추가 한 내 모든 코드를 게시 할.) 여기

내 코드입니다 : 나는 당신이 당신의 프로그래밍 로직을 검토해야합니다 생각

Private Sub LoadDateAndUser() 

    Dim SqlStr As String = "" 
    Dim sqlConn As New SqlConnection(DataSource.ConnectionString) 
    Dim sqlComm As New SqlCommand(SqlStr, sqlConn) 
    Dim sqlAdapter As New SqlDataAdapter(sqlComm) 
    Dim o_Dataset As New DataSet() 

    SqlStr = " SELECT convert(varchar(10), A.TransDate, 101) as TransDate,ADMMED.TransNum, ADMMED.AdministeredDate, D.Dosage [Dosage], ISNULL(C.GenericName, ' ') + ' (' + IsNull(B.ItemName,'') + ' ' + IsNull(B.ItemDesc,'') + ')' [Medication], ADMMED.UserID" & _ 
      " FROM INVENTORY..tbInvStockCard as A" & _ 
      " LEFT OUTER JOIN INVENTORY..tbInvMaster as B On A.ItemID = B.ItemID " & _ 
      " LEFT OUTER JOIN Inventory.dbo.tbForGeneric as C On B.GenericID = C.GenericID" & _ 
      " LEFT OUTER JOIN Station..tbNurse_AdministeredMedicines ADMMED on a.idnum= ADMMED.idnum " & _ 
      " LEFT OUTER JOIN build_file.dbo.tbCoDosage as D on A.DosageID = D.DosageID" & _ 
      " LEFT OUTER JOIN Station.dbo.tbNurseCommunicationFile as E on A.IdNum = E.IDnum and E.ReferenceNum = A.RefNum" & _ 
      " WHERE A.IdNum = '" & Session.Item("IDNum") & "' and (A.RevenueID = 'PH' or A.RevenueID = 'PC') " & _ 
      " AND A.LocationID = '20' and Not IsNull(ADMMED.AdministeredDate, '') = ''" & _ 
      " AND A.RefNum = ADMMED.ReferenceNum and ADMMED.ItemID = A.itemid" & _ 
      " AND (B.ItemClassificationID = '1' or B.ItemClassificationID = '10' or B.ItemClassificationID = '11' or B.ItemClassificationID = '16' or B.ItemClassificationID = '2' or B.ItemClassificationID = '9')" & _ 
      " order by TransDate desc,ADMMED.AdministeredDate desc" 

    sqlComm.CommandText = SqlStr 
    sqlAdapter.Fill(o_Dataset, "Table") 

    Dim o_Row As DataRow 
    Dim o_AdmDates As New Collection() 
    Dim s_FormattedLastAdmDate As String = "" 
    Dim s_FormattedAdmDate As String = "" 
    Dim o_DerivedTable As New DataTable() 

    With o_DerivedTable 
     .Columns.Add("TransDate") 
     .Columns.Add("Medication") 
     .Columns.Add("Dosage") 
     .Columns.Add("TransNum") 
    End With 

    'Select all unformatted administered dates from the query 
    Dim o_UnformattedAdmDates As DataRow() = o_Dataset.Tables(0).Select("", "AdministeredDate Desc") 

    'Extract distinct administered dates and change its format 
    For Each o_Row In o_UnformattedAdmDates 
     s_FormattedAdmDate = Format(CDate(o_Row.Item("AdministeredDate")), KC_Date_Format) 'eg. Jan 01 15 
     If s_FormattedLastAdmDate <> s_FormattedAdmDate Then 
      s_FormattedLastAdmDate = s_FormattedAdmDate 
      o_AdmDates.Add(s_FormattedLastAdmDate) 'add all formatted dates in o_AdmDates 
     End If 
    Next 

    'Add formatted administred dates to derived table 
    Dim o_Item As String 
    For Each o_Item In o_AdmDates 
     o_DerivedTable.Columns.Add(o_Item) 
    Next 

    'Loop through the administred date 
    Dim o_NewRow As DataRow 
    Dim o_NextRow As DataRow 
    Dim i_Ctr As Integer 
    Dim x_isNewRow As Boolean = True 
    Dim i_MaxRec As Integer 

    i_MaxRec = o_Dataset.Tables(0).Rows.Count - 1 

    For i_Ctr = 0 To i_MaxRec 
     o_Row = o_Dataset.Tables(0).Rows(i_Ctr) 
     If i_Ctr <> i_MaxRec Then 
      o_NextRow = o_Dataset.Tables(0).Rows(i_Ctr + 1) 
     End If 

     If x_isNewRow Then 
      o_NewRow = o_DerivedTable.NewRow() 
     End If 

     o_NewRow("TransDate") = o_Row("TransDate") 
     o_NewRow("Medication") = o_Row("Medication") 
     o_NewRow("Dosage") = o_Row("Dosage") 
     o_NewRow("TransNum") = o_Row("TransNum") 

     'Fill approriate result date column based on query 
     For Each o_Item In o_AdmDates 
      s_FormattedAdmDate = Format(CDate(o_Row.Item("AdministeredDate")), KC_Date_Format) 
      Dim AdmTim As DateTime = DateTime.Parse(o_Row("AdministeredDate")) 
      If s_FormattedAdmDate = o_Item Then 
       o_NewRow(s_FormattedAdmDate) = AdmTim.ToString("hh:mm tt") + " - " + o_Row("UserID") 
      End If 

     Next 

     If i_Ctr < i_MaxRec _ 
      And Not o_NextRow Is Nothing _ 
      And o_Row("TransDate") = o_NextRow("TransDate") _ 
      And o_Row("Medication") = o_NextRow("Medication") _ 
      And o_Row("Dosage") = o_NextRow("Dosage") _ 
      And o_Row("AdministeredDate") = o_NextRow("AdministeredDate") Then 
      x_isNewRow = False 
     Else 
      o_DerivedTable.Rows.Add(o_NewRow) 
      x_isNewRow = True 
     End If 

    Next 

    'Bind derived table 
    dgSheet.DataSource = o_DerivedTable 
    dgSheet.DataBind() 

    If o_Dataset.Tables(0).Rows.Count > 0 Then 
     GroupGridView(dgSheet.Items, 0, 3) 
    Else 

    End If 

End Sub 
+0

그래서 당신은 DGV에 대한 데이터를 준비하는 방법에, 뷰 문제입니다. 나는 당신이 확인해야한다고 생각합니다 : o_DerivedTable.Rows.Add (o_NewRow), 각 관리 날짜에 대한 새 행을 추가하지 않으려면 ... 당신은 같은 행을 유지하고 열을 추가해야합니다 .. – CristiC777

+0

pls 도움이 recode @ CristiC777 – Dale

+0

좋아, 먼저 Date1, date2 등의 열에 일반 이름을 추가하고 date1 = "Jan 19 2015 04:14 PM-8"과 같은 dataRow의 데이터로 피드하는 것이 더 좋습니다. date2 = "Jan 18 2015 04:13 PM - 8" – CristiC777

답변

0

:
거대한 SqlStr : 모든 행을 혼합 한 표가있는 DataSet을 갖게됩니다. 당신이 3를 만들

를 추가 할 필요가 얼마나 매니 열 알고 있어야하기 때문에, 그 이후

I think is better to create in that DataSet, 2 Tables:<br> 
    **first** table with: id, DateOrder, Medication, Dosage <br> 
    and **second** table with: idDate, FirstTable.id, AdministeredDate 

당신이 얼마나 많은 ADMMED.AdministeredDate.Count 알고
의는 의사 코드를 해보자 첫 번째 테이블
반복에서 ID가 두 번째로 중첩 된 -rd 표
세 번째 DataTable 인 DataGridView의 데이터 소스로 설정합니다.

+0

나는 이것을 시도 할 것이다. – Dale

+0

gogogo gogogo :) – CristiC777

+0

당신이 말하는 이드는 무엇입니까? – Dale

0

그래서 당신은 내가 당신이 ideea의를 얻을 수없는 경우 .. 그것을 잊지 지금 시간이 없다 .. 2 개 데이터 세트를 가지고 있고,이 중 하나 .. 많은 한 .. 을 생성!

enter image description here

관련 문제