我使用带有一列下拉框的Infragistics UltraWinGrid。我不希望用户能够为该列中的多行选择相同的值。是否有一个简单的(或者哎呀,我会为先进的解决方法)做到这一点?
我使用的是VB.NET
- 编辑 -
我尝试在下拉框的数据源上设置过滤器。但是当我这样做时,该列中其他框中的值开始消失(不是值本身,而是它们应该代表的描述,因此不是阅读"信息",它只是说& #34; 1&#34)。列中的所有单元格都指向同一个组合框,因此如果您从其中一个数据源中筛选出一个值,则会对其中的所有单元格进行筛选。
我目前正在尝试捕获CellChange事件并检查所有其他当前使用的值。如果它已经被使用过,我会提出一条消息,并将其恢复为旧值。但是,该值会以之前保存的值返回,因此......没有用。即将看看我是否可以使用"文本"属性。
答案 0 :(得分:2)
由于您正在使用Infragistics,您可以使用绑定到DataTable(或类似的东西)的UltraDropDown,您可以添加" Selected"除了包含您要显示的值的列之外的列。
在选择每个值时(例如,通过AfterCellUpdate
或AfterCellListCloseUp
),您可以更新"已选择的"该数据源中的列,并使用列过滤器仅显示尚未标记为已选中的项目。这样,当选择或删除项目时,下拉列表的内容将自动更新。
要从旧值清除所选标志,您可以使用BeforeCellUpdate
事件访问单元格的当前值,然后使用该值清除绑定到UltraDropDown的数据源的查找国旗。
答案 1 :(得分:1)
解决了它:
诀窍是使用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