【问题标题】:Given only a table name, get database data and edit it in a DataGrid?仅给定一个表名,获取数据库数据并在 DataGrid 中对其进行编辑?
【发布时间】:2012-11-24 14:58:55
【问题描述】:

我有一个数据库表,但架构更改过于频繁,无法将列硬编码到应用程序(WPF 应用程序)中。如何将表格中的所有行显示到 DataGrid 中并让网格中的行可编辑?

我可以从数据库中获取数据并更新数据库,但是考虑到我无法编程(例如)提前将各种列作为属性的模型 - 因为列变化非常频繁。

以前有人遇到过这个问题吗?

谢谢

【问题讨论】:

    标签: wpf datagrid


    【解决方案1】:

    我已经使用几个为 ListView 创建 GridView 的转换器完成了这项工作。我将列名和列数据(格式化为字符串)读入数组,并使用了这些转换器:

    <ValueConversion(GetType(String()), GetType(GridView))>
    Public Class TableToGridViewConverter
        Implements IValueConverter
    
    Private Shared ReadOnly ItemConverter As New ArrayToItemConverter
    Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim header() As String = TryCast(value, String())
        Dim result As New GridView
        If header IsNot Nothing Then
            For i As Integer = 0 To header.Length - 1
                result.Columns.Add(New GridViewColumn() With {.Header = header(i), .DisplayMemberBinding = New Binding() With {.Converter = ItemConverter, .ConverterParameter = i}})
            Next
        End If
        Return result
    End Function
    
    Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotSupportedException
    End Function
    End Class
    
    <ValueConversion(GetType(String()), GetType(String))>
    Public Class ArrayToItemConverter
    Implements IValueConverter
    
    Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim result As String = String.Empty
        If TypeOf value Is String() AndAlso IsNumeric(parameter) Then
            Dim values() As String = value
            Dim index As Integer = CInt(parameter)
            If index >= 0 And index < values.Length Then
                result = values(index)
            End If
        End If
        Return result
    End Function
    
    Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotSupportedException
    End Function
    End Class
    

    诀窍是为数组中的每一列创建一个 GridViewColumn,并使用一个转换器,该转换器绑定到一个值数组,并使用列索引作为 ConverterParameter 为各个列选择值。你可以这样使用它:

                        <ListView x:Name="TableDataListView" View="{Binding Path=DisplayTable.Header, Converter={StaticResource tableToGridView}}" ItemsSource="{Binding Path=DisplayRows}">
                        <ListView.ItemContainerStyle>
                            <Style TargetType="ListViewItem">
                                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                                <Setter Property="VerticalContentAlignment" Value="Top"/>        
                            </Style>
                        </ListView.ItemContainerStyle>
                    </ListView>
    

    其中绑定的属性 DisplayTable.Header 和 DisplayRows 将分别包含带有列名的字符串数组和包含实际数据的字符串数组数组。

    【讨论】:

      【解决方案2】:

      如果符合您的要求,可能还有一种不同且更简单的方法:只需使用 System.Data.DataTable 来保存您的数据并在 DataGrid 上设置 AutoGenerateColumns="True"。就我而言,我需要数组...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-23
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多