Есть ли способ разрешить только уникальные значения в столбце Infragistics UltraWinGrid?

Я использую Infragistics UltraWinGrid со столбцом раскрывающихся списков. Я не хочу, чтобы пользователь мог выбрать одно и то же значение для нескольких строк в этом столбце. Есть ли простой (или, черт возьми, я бы согласился на продвинутый) способ сделать это?

Я использую VB.NET

-РЕДАКТИРОВАТЬ-

Я попытался установить фильтр в источнике данных для раскрывающегося списка. Но когда я это сделал, значения в других полях в этом столбце начали исчезать (не сами значения, а описания, которые они должны были представлять, поэтому вместо «Информация» он просто сказал «1»). Все ячейки в столбце относятся к одному и тому же полю со списком, поэтому, если вы отфильтруете значение из источника данных для одной из них, вы отфильтруете его для всех.

В настоящее время я пытаюсь поймать событие CellChange и проверить все другие используемые в настоящее время значения. Если бы оно уже использовалось, я бы вывесил сообщение об этом и вернулся к старому значению. Однако значение возвращается как ранее сохраненное, так что... бесполезно. О том, чтобы увидеть, могу ли я использовать свойство «текст».


person BCarpe    schedule 21.03.2012    source источник
comment
Как сказал @lee-m в своем ответе, попробуйте использовать BeforeCellUpdate вместо CellChange. Возможно, вы могли бы вернуться к предыдущему значению там. Кроме того, решение от lee-m можно использовать, если вы пропустите часть удаления элемента. Конечно, вам нужно проверить, не было ли выбрано значение где-либо еще в ваших строках.   -  person Steve    schedule 22.03.2012
comment
Сделанный. Это отлично сработало.   -  person BCarpe    schedule 22.03.2012
comment
Отметьте ответ @lee-m как принятый, потому что это его идея!   -  person Steve    schedule 22.03.2012
comment
Я подумаю над этим, хотя я думаю, что его идея заключалась в том, чтобы повторно отфильтровать источник, чего я не делал. Единственное, что я взял у него, @lee-m, это использование BeforeCellUpdate вместо CellChange, что сделало мое решение немного красивее.   -  person BCarpe    schedule 22.03.2012


Ответы (2)


Поскольку вы используете Infragistics, вы можете использовать UltraDropDown, привязанный к DataTable (или что-то подобное), в который вы можете добавить столбец «Выбрано» в дополнение к столбцу, содержащему значения, которые вы хотите показать.

По мере выбора каждого значения (например, через AfterCellUpdate или AfterCellListCloseUp) вы можете обновить столбец «Выбрано» в этом источнике данных и использовать фильтр столбца, чтобы отображать только те элементы, которые не были отмечены как выбранные. Таким образом, при выборе или удалении элементов содержимое раскрывающегося списка будет автоматически обновляться.

Чтобы очистить выбранный флаг от старого значения, вы можете использовать событие BeforeCellUpdate для доступа к текущему значению ячейки, а затем выполнить поиск в источнике данных, привязанном к UltraDropDown, используя это значение, чтобы очистить флаг.

person lee-m    schedule 21.03.2012
comment
Умно, но непонятно, как восстановить предыдущий выбранный элемент до нуля, когда пользователь меняет текущий элемент, выбранный в UltraDropDown. - person Steve; 22.03.2012
comment
Я обновил свой ответ, чтобы предоставить один из возможных способов очистки выбранного флага. - person lee-m; 22.03.2012
comment
Хорошая мысль. Но когда я попробовал это, значения в других полях в этом столбце начали исчезать (не сами значения, а описания, которые они должны были представлять, поэтому вместо чтения информации было просто указано 1). Все ячейки в столбце относятся к одному и тому же полю со списком, поэтому, если вы отфильтруете значение из источника данных для одной из них, вы отфильтруете его для всех. - person BCarpe; 22.03.2012
comment
Пробовали ли вы подход Брайана Фэллона, опубликованный на форумах Infragistics: blogs.infragistics .com/forums/p/22177/80778.aspx#80778 - person alhalama; 28.06.2012

Решил это:

Хитрость заключалась в использовании BeforeCellUpdate, у которого BeforeCellUpdateEventArgs имеет элементы «NewValue» и «Cancel». Я просто просматриваю все элементы в столбце, чтобы увидеть, соответствует ли какой-либо из них новому значению. Если это так, я уведомляю пользователя и отменяю операцию.

И это все. Вот код:

Private Sub myUltraWinGrid_BeforeCellUpdate(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinGrid.BeforeCellUpdateEventArgs) Handles myUltraWinGrid.BeforeCellUpdate
        If e.Cell.Column.Key = "myColumn" Then
            Dim newValue As Integer = CInt(e.NewValue)
            For Each row As Infragistics.Win.UltraWinGrid.UltraGridRow In myUltraWinGrid.Rows
                If row.Cells("myColumn") IsNot e.Cell _ 'So I'm not checking against the current cell
                    AndAlso CInt(row.Cells("myColumn").Value) = newValue Then
                    MsgBox("That value has already been used in this column")
                    e.Cancel = True
                End If
                Next
        End If
    End Sub
person BCarpe    schedule 22.03.2012