在WPF(VB.Net)中动态创建表

时间:2018-01-16 10:30:24

标签: wpf vb.net datagridview code-behind telerik-grid

我想创建一个可编辑的表格,其大小由用户定义(大小可以是10 * 10或20 * 20或30 * 30)。

-

我找到了这个主题(here)但是它在WinForms中运行,并且WPF不支持DataGridView。

我尝试使用DataGrid,但以下行无效:

Me.DataGridTableau.ItemsSource = dt

-

我尝试使用RadGridView(Telerik)但行只能通过ItemsSource属性更新,而且我不知道会有多少列,我无法创建表示表的对象( x < / strong> x 列的属性。)

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

您可以将ItemsSource的{​​{1}}设置为任意DataGrid,包括IEnumerable的{​​{1}}:

DataView

答案 1 :(得分:0)

如果有人需要,我找到了使用RadGridView(Telerik)的解决方案:

创建此类:

Imports System.Dynamic
Imports System.Collections.Generic
Imports System.ComponentModel

Public Class MyDataRow
    Inherits DynamicObject
    Implements INotifyPropertyChanged

    ReadOnly data As IDictionary(Of String, Object)

    Public Sub New()
        data = New Dictionary(Of String, Object)()
    End Sub

    Public Sub New(ByVal source As IDictionary(Of String, Object))
        data = source
    End Sub

    Public Overrides Function GetDynamicMemberNames() As IEnumerable(Of String)
        Return data.Keys
    End Function

    Public Overrides Function TryGetMember(ByVal binder As GetMemberBinder, ByRef result As Object) As Boolean
        result = Me(binder.Name)
        Return True
    End Function

    Public Overrides Function TrySetMember(ByVal binder As SetMemberBinder, ByVal value As Object) As Boolean
        Me(binder.Name) = value
        Return True
    End Function

    Default Public Property Item(ByVal columnName As String) As Object
        Get
            If data.ContainsKey(columnName) Then
                Return data(columnName)
            End If

           Return Nothing
        End Get

    Set(ByVal value As Object)
        If Not data.ContainsKey(columnName) Then
            data.Add(columnName, value)
            OnPropertyChanged(columnName)
        Else
            If data(columnName) <> value Then
                data(columnName) = value
                OnPropertyChanged(columnName)
            End If
        End If
    End Set
End Property

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

Protected Sub OnPropertyChanged(name As String)
    Try
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
    Catch
        If Debugger.IsAttached Then Debugger.Break()
        Throw ' rethrow exception
    End Try
End Sub
Protected Sub OnPropertyChanged(event_args As PropertyChangedEventArgs)
    RaiseEvent PropertyChanged(Me, event_args)
End Sub

End Class

在您的虚拟机中,您需要一个公共财产:

    Private _tableau As ObservableCollection(Of MyDataRow)
Public Property Tableau() As ObservableCollection(Of MyDataRow)
    Get
        Return _tableau
    End Get
    Set(ByVal value As ObservableCollection(Of MyDataRow))
        _tableau = value
        OnPropertyChanged("Tableau")
    End Set
End Property

您需要创建一个加载表格的方法:

   Private Function LoadTableau() As ObservableCollection(Of MyDataRow)
    Dim taille As Integer = Me.GetTailleTableau()
    If taille = 0 Then Return Nothing

    Dim data As New ObservableCollection(Of MyDataRow)()

    For i As Integer = 0 To (taille - 1)
        Dim row = New MyDataRow()

        For j As Integer = 0 To (taille - 1)
            'row(String.Format("Column{0}", j)) = String.Format("Cell {0} {1}", i, j)
            row(j) = ""
        Next

        data.Add(row)
    Next

    Return data
End Function

您需要加载表格:

Me.Tableau = Me.LoadTableau()

你需要绑定你的表:

<telerik:RadGridView x:Name="RadGridViewTableau" ItemsSource="{Binding Tableau}" >

我希望这有帮助:)