残りのドロップダウンから選択した値を削除する可能性があるというあなたの意図に基づいたアイデアがあります。
Runner
あなたの例と同様の設定を持つというクラスがあります。
Public Class Runner
Public Property FirstName As String
Public Property LastName As String
Public Property Placement As Result
Public Sub New(fn As String, ln As String)
FirstName = fn
LastName = ln
Placement = Result.None
End Sub
End Class
また、 :Result
に入力される列挙型があります。ComboBoxCell
Public Enum Result
None = 0
Bronze = 1
Silver = 2
Gold = 3
End Enum
データオブジェクトを作成してにバインドするときはDataGridView
、次のようにします(注-配置はグローバルリスト(結果の)であり、ランナーはグローバルリスト(ランナーの)です:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Placements.Add(Result.None)
Placements.Add(Result.Bronze)
Placements.Add(Result.Silver)
Placements.Add(Result.Gold)
Runners.Add(New Runner("John", "Smith"))
Runners.Add(New Runner("Jane", "Doe"))
Runners.Add(New Runner("Bill", "Jones"))
Column1.DataPropertyName = "FirstName"
Column2.DataPropertyName = "LastName"
Column3.DataPropertyName = "Placement"
Column3.DataSource = Placements
DataGridView1.DataSource = Runners
End Sub
これで、セルの値がComboBoxColumn
変更されるたびに、列挙型を含むリストから新しい値を削除します。
Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
If (e.RowIndex > -1 And e.ColumnIndex = 2) Then
Dim currentvalue As Result = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
If currentvalue <> Result.None Then
Placements.Remove(currentvalue)
End If
End If
End Sub
ドロップダウンの選択を変更するときは注意してください...このディスカッションDataGridView
のように、値が変更されるとすぐに値をコミットするように騙す必要がありComboBox
ます。私はその議論からの答えを使用して、次のようなことをしました:
Private Sub DataGridView1_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
Dim col As DataGridViewColumn = DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex)
If col.Name = "Column3" Then
DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
Dim selected As DataGridViewCell = DataGridView1.CurrentCell
DataGridView1.CurrentCell = Nothing //This line and the next one simply hide
DataGridView1.CurrentCell = selected //an odd display effect that occurs
//because we remove a value and change the
//selection at the same time
End If
End Sub
最後に、のDataError
イベントを処理し、DataGridView
空白のままにしてExceptions
、列挙型のリストから値を削除するときにスローされないようにします。
これにより、そこまでの道のりの約90%が得られます。値を変更しても、リストにアイテムが再度追加されることはありません。たとえば、ゴールドからシルバーに変更した場合、ゴールドをリストに追加し直す必要があります。おそらく、古い値と新しい値を取得するために処理するイベントを把握し、列挙値に基づいて正しいインデックスで古い値をリストに挿入し直すことができます。