DevExpress CheckedComboBoxEdit

Приложение на VB.net. Есть элемент CheckedComboBoxEdit, который заполняеться так:

        storedPar = SqlHelperParameterCache.GetSpParameterSet(BasicCover.strSQL, "sql procedure")
        storedPar(0).Value = 0

        dsFiliales = SqlHelper.ExecuteDataset(BasicCover.strSQL, CommandType.StoredProcedure,
        "sql procedure", storedPar)
        Dim tb As DataTable = dsFiliales.Tables(0)

        RepositoryItemCheckedComboBoxEditFiliales.DataSource = dsFiliales.Tables(0)
        RepositoryItemCheckedComboBoxEditFiliales.ValueMember = 
        RepositoryItemCheckedComboBoxEditFiliales.DisplayMember = 

Проблема заключается в том что при самом первом выборе элемента код ниже не срабатывает

    Dim dt As DataTable = New DataTable("TAB") : dt.Columns.Add("ID", GetType(Int64))
    For Each it As DevExpress.XtraEditors.Controls.CheckedListBoxItem In RepositoryItemCheckedComboBoxEditFiliales.GetItems()
        If it.CheckState = CheckState.Checked Then
            'RegNumbList.Add(GridView1.GetRowCellValue(rowHandle, "IDLift").ToString())
            dt.Rows.Add(New Object() {it.Value})
        End If
    Next

т.е. как будто не элемента Checked. В повтором выборе элементов Checked все работает корректно.


Ответы (1 шт):

Автор решения: Uranus

В событии EditValueChanged синхронизация между EditValue и коллекцией RepositoryItemCheckedComboBoxEdit.Items не гарантирована. Например, если EditValue изменить без участия со стороны пользователя, синхронизация произойдет только после того, как отработают все подписчики события EditValueChanged.

Как правило, событие EditValueChanged используется для обработки нового EditValue. У CheckedComboBoxEdit тип EditValue задается свойством RepositoryItemCheckedComboBoxEdit.EditValueType.

CSV - это строка, которая содержит выбранные элементы через разделитель. Разделитель задается свойством RepositoryItemCheckedComboBoxEdit.SeparatorChar.

Private Sub RepositoryItemCheckedComboBoxEdit_EditValueChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim editor As BaseEdit = DirectCast(sender, BaseEdit)
    Dim value As String = CStr(editor.EditValue)
    Dim selectedValues() As Integer = value.Split(editor.Properties.SeparatorChar) _
        .Select(Function(t) Integer.Parse(t)) _
        .ToArray()
End Sub

List - это объект типа List.

Private Sub RepositoryItemCheckedComboBoxEdit_EditValueChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim editor As BaseEdit = DirectCast(sender, BaseEdit)
    Dim selectedValues As List(Of Object) = CType(editor.EditValue, List(Of Object))
End Sub
→ Ссылка