C# WPF中DataTable填充ListView异常,显示DataRowView求助
解决WPF ListView显示
System.Data.DataRowView的问题 我来帮你搞定这个问题!你遇到的界面显示System.Data.DataRowView的情况,核心原因是WPF的ListView没有被配置正确的列绑定规则——它默认不知道该如何解析DataRowView对象,所以直接输出了对象的类型名称。咱们一步步来修正:
1. 补全DataTable构建与ListView绑定逻辑
先把你没写完的代码补全,确保DataTable能正确生成列和行,同时给ListView配置好列渲染规则:
public partial class MainWindow : Window { ListView items; string toParse = "1 12 13\n2 15 16\n3 9 14\n20 123 541235\n4 1234 567"; string toParse2 = "id value1 value2"; public MainWindow() { InitializeComponent(); SetupListView(); } private void SetupListView() { // 1. 创建DataTable并定义列 DataTable dataTable = new DataTable(); string[] columnNames = toParse2.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); foreach (string colName in columnNames) { dataTable.Columns.Add(colName, typeof(string)); } // 2. 填充行数据 string[] rows = toParse.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); foreach (string row in rows) { string[] rowValues = row.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); dataTable.Rows.Add(rowValues); } // 3. 绑定数据源到ListView items.ItemsSource = dataTable.DefaultView; // 关键步骤:动态生成GridView列,指定每个列要绑定的字段 CreateGridViewColumns(dataTable); } private void CreateGridViewColumns(DataTable dataTable) { GridView gridView = new GridView(); foreach (DataColumn col in dataTable.Columns) { GridViewColumn column = new GridViewColumn(); column.Header = col.ColumnName; // 设置列内容的绑定,关联到DataRowView对应的列名 column.DisplayMemberBinding = new Binding(col.ColumnName); gridView.Columns.Add(column); } items.View = gridView; } }
2. 确保XAML中的ListView控件配置正确
你的XAML里需要定义好ListView控件(如果还没添加的话):
<Window x:Class="YourProjectNamespace.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="450" Width="800"> <Grid> <ListView x:Name="items"/> </Grid> </Window>
问题根源解释
当你直接把DataTable.DefaultView绑定到ListView的ItemsSource时,ListView默认使用的是基础的ItemsView,它不会自动解析DataRowView的属性值,只会调用对象的ToString()方法,所以就显示了System.Data.DataRowView。
只有当我们给ListView指定GridView,并为每一列设置DisplayMemberBinding绑定到DataTable的列名时,WPF才知道要渲染每个单元格的具体数据,而不是输出对象类型名称。
如果想更快捷,也可以开启自动生成列的功能(不过手动生成更灵活,方便后续自定义列样式):
items.View = new GridView(); ((GridView)items.View).AutoGenerateColumns = true;
内容的提问来源于stack exchange,提问作者SolisQQ
相关产品推荐
相关产品推荐

