You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串数组作为行添加至列数可变的DataGrid?

解决DataGrid添加可变列字符串数组的问题

这个问题我之前也碰到过,WPF的DataGrid默认确实不认数组直接当行数据——它只会去解析对象的公共属性(比如数组的Length、Rank这些),完全不会把数组元素对应到列上,所以才会显示空白。给你两个实用的解决办法,看你习惯哪种:

方法一:用DataTable作为数据源(推荐,适配可变列场景)

DataTable天生就是为动态列和行设计的,和DataGrid适配性极好,步骤也清晰:

  1. 先初始化一个全局的DataTable,并且根据你的列定义生成对应的数据列(比如你传给InputWindow的inputs就是列名集合吧?):
// 在窗口类里定义全局DataTable
private DataTable _dataTable = new DataTable();

// 初始化时生成列(比如在窗口Loaded事件里,或者第一次加载数据前)
foreach (var columnName in inputs)
{
    // 每列都设为字符串类型,和你的输入匹配
    _dataTable.Columns.Add(columnName, typeof(string));
}
// 把DataGrid的数据源绑定到DataTable的视图
ActiveDataGrid.ItemsSource = _dataTable.DefaultView;
  1. 然后在获取输入数组后,把数组转换成DataRow添加到DataTable里:
InputWindow iw = new InputWindow(inputs.ToArray());
if (iw.ShowDialog() == true)
{
    try
    {
        var strings = iw.GetInputs();
        // 创建新行并填充数组元素
        DataRow newRow = _dataTable.NewRow();
        for (int i = 0; i < strings.Length; i++)
        {
            newRow[i] = strings[i];
        }
        // 添加行到DataTable,DataGrid会自动刷新显示
        _dataTable.Rows.Add(newRow);
    }
    catch (ArgumentException ex)
    {
        Debug.WriteLine($"{ex.Message} from InputWindow");
    }
}

这种方法的好处是,不管列数怎么变,只要DataTable的列和输入数组长度匹配,就能自动对应显示,而且DataGrid会自动处理列的生成(如果你的AutoGenerateColumns设为true的话,连列都不用手动创建)。

方法二:直接绑定数组索引,用ObservableCollection存数据

如果你不想用DataTable,也可以直接把数组作为行数据,但需要手动给每个列绑定数组的对应索引:

  1. 先初始化一个ObservableCollection来存数组,然后动态生成DataGrid的列,每个列绑定数组的索引:
// 全局的ObservableCollection,用来存所有行的数组数据
private ObservableCollection<string[]> _rowData = new ObservableCollection<string[]>();

// 初始化列(同样在加载时处理)
for (int i = 0; i < inputs.Count; i++)
{
    DataGridTextColumn column = new DataGridTextColumn();
    column.Header = inputs[i]; // 设置列标题
    // 绑定数组的第i个元素,语法是`[索引]`
    column.Binding = new Binding($"[{i}]");
    ActiveDataGrid.Columns.Add(column);
}
// 把数据源绑定到ObservableCollection
ActiveDataGrid.ItemsSource = _rowData;
  1. 添加数据时直接把输入数组加入集合即可:
InputWindow iw = new InputWindow(inputs.ToArray());
if (iw.ShowDialog() == true)
{
    try
    {
        var strings = iw.GetInputs();
        _rowData.Add(strings); // 直接加数组,列会自动显示对应索引的元素
    }
    catch (ArgumentException ex)
    {
        Debug.WriteLine($"{ex.Message} from InputWindow");
    }
}

这个方法更轻量,但需要确保列的数量和数组长度严格对应,不然会出现索引越界或者列空白的情况。

内容的提问来源于stack exchange,提问作者Trushkeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:25:18