C#创建2行,第一行是文本视图列表,第二行是梳子列表
我的项目是一个C#应用程序,用于将数据从Excel工作表导入数据库,并提示用户手动映射它们.
我需要创建两行: >第一行是DataGridTextColumn,其中包含excel的标题 每个DataGridTextColumn都有一个组合框. 但我遇到的问题是我无法使DataGridComboBoxColumn工作,每次启动应用程序时,第一行正常工作但第二行为空 代码: foreach (DataRow row in dt.Rows) { DataGridTextColumn dgtc = new DataGridTextColumn(); dgtc.MinWidth = 100; dgtc.CanUserSort = false; dgtc.Header = row["Column_name"].ToString(); dg.Columns.Add(dgt); DataGridComboBoxColumn dgcbc = new DataGridComboBoxColumn(); dgcbc.ItemsSource = columnList; dgcbc.MinWidth = 100; dg2.Columns.Add(dgcbc); } xaml: <DataGrid x:Name="dg" HorizontalAlignment="Left" Height="29" Margin="11,72,0" VerticalAlignment="Top" Width="579"/> <DataGrid x:Name="dg2" HorizontalAlignment="Left" Height="30" Margin="11,106,0" VerticalAlignment="Top" Width="579"/> 实时视图: 代码正在运行,但组合框始终显示空字段. 有关为什么DataGridComboBoxColumn不适合我的任何帮助? 解决方法
您可能会提到两个问题.
第一个是设置dgcbc.ItemsSource = columnList不足以使ComboBox显示可供选择的项目列表. 根据columnList的类型,您需要设置DisplayMemberPath和SelectedValuePath属性,例如: var columnList = new Dictionary<string,string> { { "123","test 123" },{ "aaa","test aaa" },{ "qwe","test qwe" } }; dgcbc.ItemsSource = columnList; dgcbc.DisplayMemberPath = "Key"; dgcbc.SelectedValuePath = "Value"; 另一个问题是将列绑定到在DataGrid对象上设置的ItemsSource. dg2.ItemsSource = dt; dgcbc.TextBinding = new Binding(string.Format("[{0}]","Column_Name"); 您可能还想知道如何在DataGridTextColumn中显示文本: dgtc.Binding = new Binding(string.Format("[{0}]","Column_Name"); 我不确定这是否是您想要实现的列映射,可能您想修改网格的标题模板并将网格数据显示为下面的文本.为此,请使用DataGridTemplateColumn DataGridTextColumn列,其标题中包含标题Label和ComboBox. 编辑: 我准备了一个快速而又脏的代码解决方案. XAML: <DataGrid x:Name="dg" Grid.Row="0" AutoGenerateColumns="False"/> 代码背后: // data is a rough equivalent of DataTable being imported var data = new List<Dictionary<string,string>> { new Dictionary<string,string> { { "column1","asd asfs af" },{ "column2","45dfdsf d6" },{ "column3","7hgj gh89" } },new Dictionary<string,"aaasdfda" },"45sdfdsf 6" },"78gh jghj9" } },"s dfds fds f" },"4dsf dsf 56" },"78gh jgh j9" } },}; // a list of columns to map to var importToColumns = new List<string> { "123","aaa","qwe","456","bbb" }; importMappings = new Dictionary<string,int>(); foreach(var column in data[0]) { importMappings.Add(column.Key,-1); } foreach(var r in importMappings) { var dgtc = new DataGridTextColumn(); dgtc.Binding = new Binding(string.Format("[{0}]",r.Key)); var sp = new StackPanel(); dgtc.Header = sp; sp.Children.Add(new Label { Content = r.Key }); var combo = new ComboBox(); sp.Children.Add(combo); combo.ItemsSource = importToColumns; var selectedBinding = new Binding(string.Format("[{0}]",r.Key)); selectedBinding.Source = importMappings; combo.SetBinding(Selector.SelectedIndexProperty,selectedBinding); dgtc.MinWidth = 100; dgtc.CanUserSort = false; dg.Columns.Add(dgtc); } dg.ItemsSource = data; } private Dictionary<string,int> importMappings; 选择被批准后,importMappings将包含列的映射列表 – 对于每个导入文件列,它将包含importToColumns列表中元素的索引,如果未选择任何元素,则包含-1. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |