gpt4 book ai didi

c# - 如何自动将字符串数组绑定(bind)到 WPF DataGrid?

转载 作者:太空狗 更新时间:2023-10-29 20:04:40 24 4
gpt4 key购买 nike

我有一个 DataGridUserControl 里面.它看起来像这样:

<UserControl x:Class="ExternalDataSourceComparison.ImportedInfoGrid"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Height="Auto" Width="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<DataGrid Name="_dataGrid" Grid.Row="0">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path[0].Length}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>

我有 UserControl在我的 MainWindow看起来像这样:

<Window x:Class="ExternalDataSourceComparison.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ExternalDataSourceComparison"
Title="MainWindow" Height="350" Width="525" WindowState="Maximized">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<local:ImportedInfoGrid x:Name="ExternalData" Grid.Row="0"/>
<StackPanel Height="36px" Orientation="Horizontal" Grid.Row="1">
<Button Name="_import" Content="Import Data" Margin="5" Padding="5, 2" Click="Import_Click"/>
<Button Name="_compare" Content="Compare" Margin="5" Padding="5, 2" Click="Compare_Click"/>
<Button Name="_cancel" Content="Cancel" Margin="5" Padding="5, 2" Click="Cancel_Click"/>
</StackPanel>
</Grid>

在我的窗口后面的代码中使用方法 fs.CSVToStringArray ,我打开一个 CSV 文件并将内容解析为 string[][]外部数组表示行,内部数组表示所有列,因此字符串 [0][3] 将是第 1 行第 4 列。

在我后面的代码中,我刚刚设置了 ItemsSource等于数组的数组,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;

namespace ExternalDataSourceComparison
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
FileStuff fs = new FileStuff();
public MainWindow()
{
InitializeComponent();
}

private void Import_Click(object sender, RoutedEventArgs e)
{
string[][] array = fs.CSVToStringArray();
this.ExternalData._dataGrid.ItemsSource = array;
}

private void Cancel_Click(object sender, RoutedEventArgs e)
{

}

private void Compare_Click(object sender, RoutedEventArgs e)
{

}
}
}

虽然输出完全不是我所期望的。我认为它显示了对象的属性而不是实际内容。有没有一种方法可以自动生成行和列,或者我是否必须编写代码来创建列和行?我想到了 DataGrid你可以绑定(bind)类似 string[][] 的东西或 List<string[]>ItemsSource它只会生成列。它目前正在自动生成列,只是没有用 string[][] 的内容填充它们。 .

最佳答案

DataGrid 的自动生成列功能不太适合显示锯齿状数组数据。它更适合单个一维集合,其中 DataGrid 中的每一行代表集合中的单个项目,每一列代表相应项目的不同属性。

并且除非 ItemsSource 中的项目是准备好显示的模型,否则您不应该依赖自动生成列功能(它将显示所有属性的列,包括那些不意味着的属性待显示)。尝试自动DataGrid 绑定(bind)到数组时的另一个问题是,DataGrid 没有关于如何命名列的信息。

最后,我认为您最好以某种方式定义 DataGrid 列,而不是让 DataGrid 自行生成列。例如,从 XAML 定义它,假设数组中始终有两个“列”:

<DataGrid Name="_dataGrid" Grid.Row="0" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Column 1" Binding="{Binding [0]}"/>
<DataGridTextColumn Header="Column 2" Binding="{Binding [1]}"/>
</DataGrid.Columns>
</DataGrid>

或者从代码中定义列,以防您有动态的列数,例如:

string[][] array = fs.CSVToStringArray();
for (int i = 0; i < array[0].Length; i++)
{
var col = new DataGridTextColumn();
col.Header = "Column " + i;
col.Binding = new Binding(string.Format("[{0}]", i));
_dataGrid.Columns.Add(col);
}
this.ExternalData._dataGrid.ItemsSource = array;

关于c# - 如何自动将字符串数组绑定(bind)到 WPF DataGrid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22922533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com