C#创建两行,第一行是文本视图列表,第二行是梳框列表
我的项目是一个C#应用程序,用于将数据从excel工作表导入数据库,并提示用户手动映射数据 我需要创建两行:C#创建两行,第一行是文本视图列表,第二行是梳框列表,c#,wpf,datagrid,datagridcomboboxcolumn,datagridtextcolumn,C#,Wpf,Datagrid,Datagridcomboboxcolumn,Datagridtextcolumn,我的项目是一个C#应用程序,用于将数据从excel工作表导入数据库,并提示用户手动映射数据 我需要创建两行: 第一行是一个DataGridTextColumn,其中包含excel的标题 适合 第二行是一个DataGridComboxColumn,具有数据库的列名 每个DataGridTextColumn都有一个组合框 但我面临的问题是,我无法使DataGridComboxColumn正常工作,每次启动应用程序时,第一行正常工作,但第二行为空 代码: foreach (DataRow row in
DataGridTextColumn
,其中包含excel的标题
适合DataGridComboxColumn
,具有数据库的列名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,0" VerticalAlignment="Top" Width="579"/>
<DataGrid x:Name="dg2" HorizontalAlignment="Left" Height="30" Margin="11,106,0,0" VerticalAlignment="Top" Width="579"/>
实时查看:
代码正在运行,但组合框始终显示空字段
关于为什么DataGridComboxColumn对我不起作用,有什么帮助吗?您可能会提到两个问题。 首先,设置dgcbc.ItemsSource=columnList不足以使组合框显示可供选择的项目列表 根据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";
您可能还想知道如何在DataGridTextColumn中显示文本:
dgtc.Binding = new Binding(string.Format("[{0}]", "Column_Name");
我不确定这是否是您想要实现的列映射,可能您想要修改网格的标题模板,并将网格数据显示为以下文本。要做到这一点,请使用DataGridTemplateColumn DataGridTextColumn,并在其标题中包含标题标签和组合框。
希望能有帮助
编辑:
我准备了一个快速而肮脏的纯代码解决方案
XAML:
代码隐藏:
// 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, string> { { "column1", "aaasdfda" }, { "column2", "45sdfdsf 6" }, { "column3", "78gh jghj9" } },
new Dictionary<string, string> { { "column1", "s dfds fds f" }, { "column2", "4dsf dsf 56" }, { "column3", "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;
//数据大致相当于导入的DataTable
var数据=新列表
{
新字典{{“column1”,“asd asfs af”},{“column2”,“45dfdsf d6”},{“column3”,“7hgj gh89”},
新词典{{“column1”,“aaasdfda”},{“column2”,“45sdfdsf 6”},{“column3”,“78gh jghj9”},
新字典{{“column1”,“s dfds fds f”},{“column2”,“4dsf dsf 56”},{“column3”,“78gh jgh j9”},
};
//要映射到的列的列表
var importToColumns=新列表
{
"123",
“aaa”,
“qwe”,
"456",
“bbb”
};
importMappings=新字典();
foreach(数据[0]中的var列)
{
importMappings.Add(column.Key,-1);
}
foreach(进口文件中的var r)
{
var dgtc=新的DataGridTextColumn();
Binding=newbinding(string.Format(“[{0}]”,r.Key));
var sp=新StackPanel();
dgtc.Header=sp;
添加(新标签{Content=r.Key});
var combo=新组合框();
sp.Children.Add(组合);
combo.ItemsSource=importToColumns;
var selectedBinding=新绑定(string.Format(“[{0}]”,r.Key));
selectedBinding.Source=导入映射;
combo.SetBinding(Selector.SelectedIndexProperty,selectedBinding);
dgtc.MinWidth=100;
dgtc.CanUserSort=false;
dg.列。添加(dgtc);
}
dg.ItemsSource=数据;
}
私人字典进口资料;
选择被批准后,importMappings将包含列映射列表-对于每个导入文件列,它将包含importToColumns列表中元素的索引,如果未选择元素,则为-1。columnList来自何处?我猜要么是
null
要么是空的…SqlConnection conn=newsqlconnection(“server=***;database=***;integratedsecurity=true”);string[]restrictions=新字符串[4]{null,null,“orders”,null};conn.Open();var columnList=conn.GetSchema(“Columns”,restrictions).AsEnumerable().Select(s=>s.Field(“Column_Name”)).ToList();这足以确保columnList不为null,并且它有4个字符串,我甚至对它进行了测试..现在多亏了你,我知道了我的问题。。如何实现包含标题标签和组合框的DataGridTemplateColumn列。不幸的是,这已经是3天的研究了,但什么都没有..我对代码做了一些配置,但感谢它帮了我很多。
<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, string> { { "column1", "aaasdfda" }, { "column2", "45sdfdsf 6" }, { "column3", "78gh jghj9" } },
new Dictionary<string, string> { { "column1", "s dfds fds f" }, { "column2", "4dsf dsf 56" }, { "column3", "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;