如何将Array数据绑定到DataGrid,实现数据更新?
How to bind Array data to DataGrid and realize data update?
我想将数组绑定到 4 列 DataGrid 并更新数据。这可能吗?
如果无法实现,需要如何修改?
对于自动更新,似乎我们可以绑定到一些具有可编辑值的对象集合,就是为该项目定义一个class。但是我不知道怎么做。
public partial class MainWindow : Window
{
int X=18;
public MainWindow()
{
InitializeComponent();
int[] arr = new int[] { 61, 61, 61, 61, 61, 20, 30, 40, 50, 100, 200, 300, 400, 500, 0, 0, 0, 0, 0, 18, 23, 65, 41, 22, 91, 64, 33, 18, 44, 63, 91, 26, 32, 61, 83, 91, 26, 32, 91, 91, 91, 91 };
DataGrid dataGrid = new DataGrid();
dataGrid.AutoGenerateColumns = false;
dataGrid.ItemsSource = arr.ToList();
for (int i = 1; i < 5; i++)
{
DataGridTemplateColumn column = new DataGridTemplateColumn();
column.Header = "Value"+i;
DataTemplate cellTemplate = new DataTemplate();
FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock));
textBlock.SetBinding(TextBlock.TextProperty, new Binding("."));
cellTemplate.VisualTree = textBlock;
column.CellTemplate = cellTemplate;
DataTemplate cellEditingTemplate = new DataTemplate();
FrameworkElementFactory textBox = new FrameworkElementFactory(typeof(TextBox));
textBox.SetBinding(TextBox.TextProperty, new Binding("."));
cellEditingTemplate.VisualTree = textBox;
column.CellEditingTemplate = cellEditingTemplate;
dataGrid.Columns.Add(column);
}
canvas.Children.Add(dataGrid);
Canvas.SetLeft(dataGrid, X);
}
}
结果:
我要这样的结果:
61, 61, 61, 61, 61,
20, 30, 40, 50, 100,
200, 300, 400, 500, 0,
0, 0, 0, 0, 18,
您只能使用数组来完成。请注意,ItemsControl.ItemsSource
是 IEnumerable
类型:您可以将数组直接分配给此 属性.
ToList()
调用在这里是多余的。
同样使用DataGridTextColumn
代替DataGridTemplateColumn
来消除单元格模板的修改,只添加一个TextBlock
.
DataGrid
将其 IEnumerable
源集合的每个项目视为一行。这就是为什么您的 table 看起来是这样的:每个数字都被写入一个新行。对每一列重复此操作。
这意味着,您必须更改您的数据结构以适应每一项到一行的规则。因为您有五列,所以您必须构建数组以提供 5 元组(五元组)的元素 - 每个五元组元素到一行。
您可以通过使用锯齿状数组即数组数组来实现此目的。
然后在配置 DataGrid.Columns
时,您必须使用绑定索引器才能从数组(行数据)中提取列的值。
"For automatic updates [...]"
你要知道,使用数组是没有“自动更新”的。如果要在应用程序处于 运行(动态数据)时修改数组,则必须使用 ObservableCollection<int[]>
而不是 int[][]
交错数组。
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
int[][] numbers =
{
new[] { 61, 61, 61, 61, 61 },
new[] { 20, 30, 40, 50, 100 },
new[] { 200, 300, 400, 500, 0 }
};
this.NumbersDataGrid.ItemsSource = numbers;
}
}
MainWindow.xaml
<Window>
<DataGrid x:Name="NumbersDataGrid"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Value1"
Binding="{Binding [0]}" />
<DataGridTextColumn Header="Value2"
Binding="{Binding [1]}" />
<DataGridTextColumn Header="Value3"
Binding="{Binding [2]}" />
<DataGridTextColumn Header="Value4"
Binding="{Binding [3]}" />
<DataGridTextColumn Header="Value4"
Binding="{Binding [4]}" />
</DataGrid.Columns>
</DataGrid>
</Window>
我想将数组绑定到 4 列 DataGrid 并更新数据。这可能吗?
如果无法实现,需要如何修改?
对于自动更新,似乎我们可以绑定到一些具有可编辑值的对象集合,就是为该项目定义一个class。但是我不知道怎么做。
public partial class MainWindow : Window
{
int X=18;
public MainWindow()
{
InitializeComponent();
int[] arr = new int[] { 61, 61, 61, 61, 61, 20, 30, 40, 50, 100, 200, 300, 400, 500, 0, 0, 0, 0, 0, 18, 23, 65, 41, 22, 91, 64, 33, 18, 44, 63, 91, 26, 32, 61, 83, 91, 26, 32, 91, 91, 91, 91 };
DataGrid dataGrid = new DataGrid();
dataGrid.AutoGenerateColumns = false;
dataGrid.ItemsSource = arr.ToList();
for (int i = 1; i < 5; i++)
{
DataGridTemplateColumn column = new DataGridTemplateColumn();
column.Header = "Value"+i;
DataTemplate cellTemplate = new DataTemplate();
FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock));
textBlock.SetBinding(TextBlock.TextProperty, new Binding("."));
cellTemplate.VisualTree = textBlock;
column.CellTemplate = cellTemplate;
DataTemplate cellEditingTemplate = new DataTemplate();
FrameworkElementFactory textBox = new FrameworkElementFactory(typeof(TextBox));
textBox.SetBinding(TextBox.TextProperty, new Binding("."));
cellEditingTemplate.VisualTree = textBox;
column.CellEditingTemplate = cellEditingTemplate;
dataGrid.Columns.Add(column);
}
canvas.Children.Add(dataGrid);
Canvas.SetLeft(dataGrid, X);
}
}
结果:
我要这样的结果:
61, 61, 61, 61, 61,
20, 30, 40, 50, 100,
200, 300, 400, 500, 0,
0, 0, 0, 0, 18,
您只能使用数组来完成。请注意,ItemsControl.ItemsSource
是 IEnumerable
类型:您可以将数组直接分配给此 属性.
ToList()
调用在这里是多余的。
同样使用DataGridTextColumn
代替DataGridTemplateColumn
来消除单元格模板的修改,只添加一个TextBlock
.
DataGrid
将其 IEnumerable
源集合的每个项目视为一行。这就是为什么您的 table 看起来是这样的:每个数字都被写入一个新行。对每一列重复此操作。
这意味着,您必须更改您的数据结构以适应每一项到一行的规则。因为您有五列,所以您必须构建数组以提供 5 元组(五元组)的元素 - 每个五元组元素到一行。
您可以通过使用锯齿状数组即数组数组来实现此目的。
然后在配置 DataGrid.Columns
时,您必须使用绑定索引器才能从数组(行数据)中提取列的值。
"For automatic updates [...]"
你要知道,使用数组是没有“自动更新”的。如果要在应用程序处于 运行(动态数据)时修改数组,则必须使用 ObservableCollection<int[]>
而不是 int[][]
交错数组。
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
int[][] numbers =
{
new[] { 61, 61, 61, 61, 61 },
new[] { 20, 30, 40, 50, 100 },
new[] { 200, 300, 400, 500, 0 }
};
this.NumbersDataGrid.ItemsSource = numbers;
}
}
MainWindow.xaml
<Window>
<DataGrid x:Name="NumbersDataGrid"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Value1"
Binding="{Binding [0]}" />
<DataGridTextColumn Header="Value2"
Binding="{Binding [1]}" />
<DataGridTextColumn Header="Value3"
Binding="{Binding [2]}" />
<DataGridTextColumn Header="Value4"
Binding="{Binding [3]}" />
<DataGridTextColumn Header="Value4"
Binding="{Binding [4]}" />
</DataGrid.Columns>
</DataGrid>
</Window>