【问题标题】:Create table dynamically in WPF (VB.Net)在 WPF (VB.Net) 中动态创建表
【发布时间】:2018-06-25 00:53:06
【问题描述】:

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

--

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

我尝试使用 DataGrid,但以下行不起作用:

Me.DataGridTableau.ItemsSource = dt

--

我尝试使用 RadGridView (Telerik),但行只能通过 ItemsSource 属性更新,并且就像我不知道会有多少列一样,我无法创建代表表的对象 (xx 列的 /strong> 属性)。

有人可以帮我吗?

【问题讨论】:

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


    【解决方案1】:

    您可以将DataGridItemsSource 设置为任何IEnumerable,包括DataViewDataTable

    Me.DataGridTableau.ItemsSource = dt.DefaultView
    

    【讨论】:

    • 它不起作用,我有一个灰色区域(我认为是设置的网格),但这不是预期的结果。还有一个错误?
    • 嗯,这就是您将 ItemsSource 设置为 DataTable 的方式。我虽然这是你在问什么。确保 DataTable 实际包含任何数据,如果您有其他问题,请提出新问题。
    【解决方案2】:

    如果有人需要,我找到了使用 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}" >
    

    希望对你有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多