2014-09-04 5 views
0

잘하면 도와 줄 수 있습니다. 네비게이션이 목록 상자와 직접 만든 다음 및 이전 단추 세트와 관련된 쿼리에 바인딩 된 양식이 있습니다. 로드시 목록 상자에서 첫 번째 행을 선택하고 포커스가 자동으로 동일한 첫 번째 행에 설정됩니다. 따라서 첫 번째 행을 선택하면 레코드의 고유 ID를 가져 와서 레코드 세트를 복제하여 양식에 표시 할 수 있습니다. 텍스트 상자 및 드롭 다운을 통해 양식의 레코드를 업데이트 할 때 레코드가 특정 조건을 충족하면 테이블에서 삭제되고 다른 테이블에 추가됩니다. 그래서, 레코드를 삭제 한 후 목록 상자에 동일한 행을 선택하려고 시도합니다. 다시 쿼리 한 후에 바로 다음 레코드를 보여 주어야합니다. 문제는 listindex가 변경되고 직접 실행 창에서 끌어 올리면 이전에 클릭 한 행의 인덱스 번호가 점선으로 표시되지만 실제 선택한 행과 검게 된 행은 표시되지 않습니다. listbox.setfocus 명령을 통해이 문제가 발생했지만 setfocuses를 모두 꺼내어 도움이되었습니다. 그러나 이제 사용자는 목록 상자가 onfocus가 아니기 때문에 마우스 휠을 사용할 수 없습니다. 또한 오른쪽의 스크롤 막대를 클릭하면 점선이 다시 나타납니다.리스트 박스 인덱스에서 ms 액세스 vba와의 문제 및 클릭시 setfocus 변경

AfterUpdate 코드는 완료되면 레코드를 이동합니다. 거기에 move_completed 프로 시저가 있지만 완료시 레코드를 아카이브 테이블로 이동하는 데 필요한 SQL을 실행하는 데만 사용됩니다. 목록 상자와 양식을 동기화 할 수없는 경우 레코드를 이동하기 위해 올바른 고유 ID를 선택하지 않는 코드로 인해 레코드가 올바르게 이동하지 않습니다.

도움이 되셨습니다. 내가 코드를 누락하는 경우 알려주세요)

 Private Sub Form_Load() 
     With Me 
     'I populate the hidden text box below in order to keep a reference as data is updated and use it when we need to do requeries 
      .txtCurrentFile.Value = Forms!frmSelectPT.cboSelectPTFile.Value 
      'QRecSel is the name of the listbox which is now being populated, onload 
      .QRecSel.RowSource = "" & _ 
       "SELECT P.ID, P.[Member Number], P.[Member SSN], P.[Last Name] & ', ' & P.[First Name] AS [Mbr Name], P.DOB, " & _ 
       "P.[Member Eff Date], P.HRID, P.[Date Completed], P.[Enrollment Rep], P.[Edit Worked], P.Comments " & _ 
       "FROM sqPTRecSource AS P " & _ 
       "WHERE (((P.[File Name])='" & .txtCurrentFile & "'));" 
     End With 
     'Here we move to the first row and subsequently will make the form's record to the first row selected 
     Call MoveToFirstOnlist 

    End Sub 


    Sub MoveToFirstOnlist() 
     Dim rs As DAO.Recordset, strEditRcdID As String 
     'I will now select top row, since my listbox has no headders, then it's 0,0 
     Me!QRecSel.Selected(0) = True 
     'I noticed this line is a little redundant, since the listbox bound column is column "0" anyways, but it works for me when I pull the ID 
     strEditRcdID = Nz(Me.QRecSel.Column(0), 0) 
     Set rs = Me.Form.RecordsetClone 
     rs.FindFirst "[ID] = " & strEditRcdID 
     Me.Form.Bookmark = rs.Bookmark 

    'Cleanup 
     Set rs = Nothing 
     strEditRcdID = "" 
    End Sub 

    Private Sub cmdNext_Click() 
     With Me.QRecSel 
      If IsNull(Me.QRecSel.Column(0, (.ListIndex) + 1)) = False Then 
       Me.QRecSel.Selected((.ListIndex) + 1) = True 
       QRecSel_Click 
      Else 
       MsgBox "The last edit is already selected!" 
      End If 
     End With 
    End Sub 

    Private Sub cmdPrevious_Click() 
     Dim lngIndex As Long 

     With Me.QRecSel 
      lngIndex = .ListIndex 

      If lngIndex > 0 Then 
       .Selected(lngIndex - 1) = True 
       QRecSel_Click 

      ElseIf lngIndex = 0 Then 
       MsgBox "The first edit is already selected!" 
      End If 
     End With 
    End Sub 

    Private Sub QRecSel_Click() 
     Dim rst As DAO.Recordset, varID As Variant 
     RunCommand acCmdSaveRecord 
     varID = "'" & Me!QRecSel.Column(0) & "'" 
     Set rst = Form.RecordsetClone 
     rst.FindFirst "cstr([ID]) = " & varID 
     Form.Bookmark = rst.Bookmark 

     Set rst = Nothing 
     varID = "" 
    End Sub 

Private Sub cboEditWorked_AfterUpdate() 
    On Error GoTo Error_Handler 
    Dim strCurrRecID As String, lngRow As Long, lngLastIndex As Long, strLastRowSource As String 
    With Me 
     strCurrRecID = .QRecSel.Column(0) 
     If .cboEditWorked.Value = "Yes" Then 
     If .cboEnrollmentRep.Value = "" Or IsNull(.cboEnrollmentRep) = True Then 
      MsgBox "Please pick 'Enrollment Rep' from list", vbCritical, "No Enrollment Rep!" 
      .cboEditWorked.Value = "No" 
      RunCommand acCmdSaveRecord 
     ElseIf .cboEnrollmentRep.Value <> "" Or IsNull(.cboEnrollmentRep) = False And .cboEditWorked.Value = "yes" Then 
      .txtDateCompleted.Value = Format(Date, "MM/DD/YYYY") 
      RunCommand acCmdSaveRecord 
      lngLastIndex = .QRecSel.ListIndex 
      strLastRowSource = .QRecSel.RowSource 
      Move_Completed .cboEnrollmentRep, .cboEditWorked, .QRecSel.Column(0), "tbl_MEI_PT_ARCHIVE", _ 
       "tbl_MEI_PT_WORK", "ID" 
      .QRecSel.Requery 
      If .QRecSel.ListCount > 0 Then 
       .QRecSel.Selected(lngLastIndex) = True 
       QRecSel_Click 
      Else 
       If .QRecSel.ListCount > 0 Then 
        Call MoveToFirstOnlist 
       End If 
      End If 
     End If 
     End If 
    End With 

Exit_Here: 
    strCurrRecID = "": lngRow = 0: lngLastIndex = 0 
    Exit Sub 

Error_Handler: 
    Resume Exit_Here 

End Sub 

답변

0

글쎄, 몇 일 동안 참을성있게 기다리고, 그리고 한 전문가는 물 밖으로 나를 끌어 걱정 후, 나는 약 100 페이지를 읽을하기로 결정

Me.lstMyListBox = Null 

다른 작업이 완료되기 전에 ListIndex 값을 재설정 : 마이크로 소프트 문서 쓸모없는, 실현 나는 하나의 코드 한 줄없는 한 (파악 후 나는 내 시간을 낭비했다). 내 대답은 항상 내 얼굴 앞에 있었다. 결국 AfterUpdate 이벤트는 다음과 같이 보이며 아름답게 작동합니다.

 '1.Check if there are any records listed on the listbox 
     '2.Check if it's possible to move to the next record on the list 
     '3.If you couldn't move to next item then move to previous 
     '4.If you coudn't move to either then move to first 
     If .QRecSel.ListCount > 0 Then 
      If IsNull(DLookup("[ID]", "[sqPTRecSource]", "[ID]=" & strNextID & "")) = False Then 
       For lngRow = 0 To .QRecSel.ListCount - 1 
       If .QRecSel.Column(0, lngRow) = strNextID Then 
        .QRecSel = Null 
        .QRecSel.Selected(lngRow) = True 
        QRecSel_Click 
        Exit For 
       End If 
       Next lngRow 
      ElseIf IsNull(DLookup("[ID]", "[sqPTRecSource]", "[ID]=" & strPrevID & "")) = False Then 
       For lngRow = 0 To .QRecSel.ListCount - 1 
       If .QRecSel.Column(0, lngRow) = strPrevID Then 
        .QRecSel = Null 
        .QRecSel.Selected(lngRow) = True 
        QRecSel_Click 
        Exit For 
       End If 
       Next lngRow 
      Else 
       Call MoveToFirstOnlist 
      End If 
     End If 
    End If