Свойство ListIndex возвращает -1, даже если что-то выбрано - PullRequest
0 голосов
/ 15 января 2019

Я много гуглил, спрашивал своих коллег и даже пытался создать обходной код. Я попытался изменить имя списка и создать новый.

У меня есть список с именем lbx_genoutages в пользовательской форме. Я хочу получить номер строки выбора. Даже если что-то выбрано, оно всегда возвращает отрицательное (-1).

Единственное время, когда это работает, - это если я выбираю первую запись (запись 0).

Вот строка с кодом ошибки:

listboxId = Me.lbx_genoutages.List(Me.lbx_genoutages.ListIndex, 0)

Я попытался изменить «я» на имя пользовательской формы. Я прикрепил изображение списка, показывая что-то выбранное, но все равно выдает ошибку. Я также дважды проверил правильность написания имени списка и т. Д. listbox

Это работает для других списков на других пользовательских формах в той же программе. Я сравнил свойства обоих списков, но различий не было.

Вот код, который заполняет список при инициализации пользовательской формы:

    frm_dbGenBrowser.lbx_genoutages.Clear
    frm_dbGenBrowser.lbx_genoutages.ColumnCount = 8
    frm_dbGenBrowser.lbx_genoutages.ColumnWidths = "0, 40, 40, 40, 40, 60, 70, 50"

    If q = "" Then 'query could be already filled if specified when this sub was called. This is used for sorting.
        q = "SELECT * FROM SLA_Generators as s left join (list_lcc as l) on s.sg_lcc = l.id" & _
            " WHERE SG_deleted = No " & _
            " AND SG_outDate <= #" & frm_dbGenBrowser.DTPicker2.Value & "# " & _
            " AND SG_retDate >= #" & frm_dbGenBrowser.DTPicker1.Value & "# " & _
            " ORDER BY " & orderby
    End If
        Set rs = con.Execute(q)

    Do Until rs.EOF 'for each outage, add it into the list
        If rs.Fields("SG_isOutage").Value = True Then partialOutage = "" Else partialOutage = " *"
        With frm_dbGenBrowser.lbx_genoutages
            .addItem
            .List(i, 0) = rs.Fields("s.ID").Value
            .List(i, 2) = nz(rs.Fields("lccname").Value, "")
            .List(i, 1) = rs.Fields("SG_unit").Value
            .List(i, 3) = rs.Fields("SG_reduction").Value & partialOutage
            .List(i, 4) = IIf(rs.Fields("SG_dailyReport").Value = True, "Y", "N")
            .List(i, 5) = rs.Fields("SG_outDate").Value
            .List(i, 6) = rs.Fields("SG_retDate").Value
            If Len(rs.Fields("SG_reason")) > 0 Then
                .List(i, 7) = rs.Fields("SG_reason").Value
            Else
                .List(i, 7) = ""
            End If
            If rs.Fields("s.ID").Value = outageId Then .ListIndex = i
        End With
        rs.MoveNext
        i = i + 1
    Loop

1 Ответ

0 голосов
/ 15 января 2019

Вы работаете с двумя экземплярами, так или иначе.

Предположительно, вы заполняете списки в экземпляре формы по умолчанию :

frm_dbGenBrowser.lbx_genoutages.Clear
frm_dbGenBrowser.lbx_genoutages.ColumnCount = 8
frm_dbGenBrowser.lbx_genoutages.ColumnWidths = "0, 40, 40, 40, 40, 60, 70, 50"

Но тогда вы не показываете этот экземпляр:

With New frm_dbGenBrowser
    .Show
End With

Когда вышеуказанный (правильный) код выполняется, все, что относится к экземпляру по умолчанию (то есть с использованием имени формы вместо Me / текущего экземпляра), произошло на этом не показанном, но экземпляр в памяти независимо, и вы получите -1, потому что на самом деле ничего не выбрано в этом экземпляре .

Формы являются объектами, и, как вы можете видеть, если не обрабатывать их, они быстро становятся подверженными ошибкам и сбивают с толку.

Старайтесь не ссылаться на экземпляр формы по умолчанию в своем собственном коде. Используйте Me вместо имени класса формы, и проблема исчезнет независимо от того, запускаете ли вы .Show для экземпляра по умолчанию или для New экземпляра.

Эмпирическое правило, избегайте использования экземпляров по умолчанию с сохранением состояния любого класса, включая классы форм. См. UserForm1.Show (заявление об отказе: я написал эту статью) для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...