如何将字符串数组作为行添加至列数可变的DataGrid?
解决DataGrid添加可变列字符串数组的问题
这个问题我之前也碰到过,WPF的DataGrid默认确实不认数组直接当行数据——它只会去解析对象的公共属性(比如数组的Length、Rank这些),完全不会把数组元素对应到列上,所以才会显示空白。给你两个实用的解决办法,看你习惯哪种:
方法一:用DataTable作为数据源(推荐,适配可变列场景)
DataTable天生就是为动态列和行设计的,和DataGrid适配性极好,步骤也清晰:
- 先初始化一个全局的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;
- 然后在获取输入数组后,把数组转换成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,也可以直接把数组作为行数据,但需要手动给每个列绑定数组的对应索引:
- 先初始化一个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;
- 添加数据时直接把输入数组加入集合即可:
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
相关产品推荐
相关产品推荐

