私はvb.net 4.0 wpfプロジェクトにデータグリッドを持っています。私はDataGridComboBoxColumnをバインドする方法についてXAMLの多くの例を見てきましたが、私は列を自動生成するので、コードでこれを行う必要があります。私は、datagridbindingソースを複数のデータセットに切り替えます。WPF Datagrid DataGridComboBoxColumn実行時に自動生成
これらのカスタムクラスの中には、いくつかのリストがあります。テキストとチェックボックスを自動的に生成するようにすることができます。私の配列(私はさまざまな種類を試してみました)に遭遇すると、その中に単語(Collection)を持つtextboxcolumnが表示されます。
たとえば、 - 1画面私はWMI呼び出しに関するシステム情報を取得しています。 1つの呼び出しでサーバー上のすべてのIPアドレスが返されます(最大8つのIPアドレスを持つことができます)。IPアドレスごとに列を必要としません。私はそれらをドロップダウンして見ることができるように、それらのリストをデータグリッドに含めたいと思います。
これが可能かどうか、あるいは私が何か間違っているのであれば、どんな提案もありますか?
は
サンプルコード
Imports System.Collections.ObjectModel
Class MainWindow
Dim ServerInfoArray As ObservableCollection(Of ServerInfo) = New ObservableCollection(Of ServerInfo)
Private ReadOnly _ipAddresses As ObservableCollection(Of String) = New ObservableCollection(Of String)
Private Sub GetInfo(ByVal list As List(Of String))
For Each server As String In list
Dim tempip As List(Of String) = New List(Of String)
Dim sinfo As ServerInfo = New ServerInfo
tempip.Add("192.129.123.23")
tempip.Add("23.213.223.21")
sinfo.IPArray = tempip
sinfo.Servername = server
ServerInfoArray.Add(sinfo)
Next
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
Dim serverlist As List(Of String) = New List(Of String)
serverlist.Add("Test")
serverlist.Add("Random")
serverlist.Add("Local")
GetInfo(serverlist)
End Sub
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
Dim Col_Serial As DataGridTextColumn = New DataGridTextColumn()
Col_Serial.Binding = New Binding("Servername")
Col_Serial.Header = "Servername"
Col_Serial.Width = 40
Dim Col_IPArray = New DataGridComboBoxColumn()
Col_IPArray.Header = "IP Addresses"
Col_IPArray.IsReadOnly = True
Col_IPArray.ItemsSource = Me._ipAddresses
Col_IPArray.SelectedItemBinding = New Binding("IPArray")
DataGrid1.Columns.Add(Col_Serial)
DataGrid1.Columns.Add(Col_IPArray)
DataGrid1.ItemsSource = ServerInfoArray
End Sub
End Class
Class ServerInfo
Dim _Servername As String
Dim _IPArray As List(Of String)
Public Property Servername() As String
Get
Return _Servername
End Get
Set(ByVal value As String)
_Servername = value
End Set
End Property
Public Property IPArray As List(Of String)
Get
Return _IPArray
End Get
Set(ByVal value As List(Of String))
_IPArray = value
End Set
End Property
Public Sub New()
_Servername = Nothing
_IPArray = New List(Of String)
End Sub
エンドクラス
はあなたにblinsありがとう...、私はそこに自動生成は、ArrayListのを使用するための簡単な方法があったか、または期待していましたリスト(文字列の)は簡単にコンボボックスを作る。しかし、私はタブの変更イベント中に私が欲しい私の列をクリアして再作成するのは難しくないと思います。 datagridcomboboxcolumnを適切にバインドするコードをありがとう。私は明日それを試してみる。 – Jasin
少し助けが必要な場合があります。コンボボックスはローカル配列にバインドされています。私のデータグリッドは、必要なすべての変数を持つクラスである配列にバインドされています。私のクラスは15の異なる文字列を含むServerInfoであり、1つはIP ArrayというこのList(Of String)です。データグリッドは私のServerInfoArray = List(Of ServerInfo)にバインドされています。 – Jasin
私の例では(ObservableCollectionにリストアイテム(pocoオブジェクトから)をロードしています。 ObservableCollectionは、アイテムが追加、削除されたときにコレクションが通知を変更してバインディングを更新する特別なタイプの汎用コレクションです。プレーンなリストはこれを行いませんので、ビューをリストにバインドすると、リスト内の項目を変更するだけでコンボボックスの項目は変更されません(ObservableCollectionを使用すると、それらの項目が変更されます)。 – blins