【发布时间】:2012-11-24 14:58:55
【问题描述】:
我有一个数据库表,但架构更改过于频繁,无法将列硬编码到应用程序(WPF 应用程序)中。如何将表格中的所有行显示到 DataGrid 中并让网格中的行可编辑?
我可以从数据库中获取数据并更新数据库,但是考虑到我无法编程(例如)提前将各种列作为属性的模型 - 因为列变化非常频繁。
以前有人遇到过这个问题吗?
谢谢
【问题讨论】:
我有一个数据库表,但架构更改过于频繁,无法将列硬编码到应用程序(WPF 应用程序)中。如何将表格中的所有行显示到 DataGrid 中并让网格中的行可编辑?
我可以从数据库中获取数据并更新数据库,但是考虑到我无法编程(例如)提前将各种列作为属性的模型 - 因为列变化非常频繁。
以前有人遇到过这个问题吗?
谢谢
【问题讨论】:
我已经使用几个为 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 将分别包含带有列名的字符串数组和包含实际数据的字符串数组数组。
【讨论】:
如果符合您的要求,可能还有一种不同且更简单的方法:只需使用 System.Data.DataTable 来保存您的数据并在 DataGrid 上设置 AutoGenerateColumns="True"。就我而言,我需要数组...
【讨论】: