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