2014-10-17 56 views
4

我的项目是一个C#应用程序,用于将数据从Excel表导入数据库并提示用户手动映射它们。C#创建2行,第一个是文本视图列表,第二个是梳理框列表

我需要创建两行:

  1. 第一行是一个DataGridTextColumn在Excel的头 适合。
  2. 第二行是一个DataGridComboBoxColumn具有数据库的列名

的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,0" VerticalAlignment="Top" Width="579"/> 
<DataGrid x:Name="dg2" HorizontalAlignment="Left" Height="30" Margin="11,106,0,0" VerticalAlignment="Top" Width="579"/> 

实时取景:

screenshot

该代码正在工作,但组合框始终显示空白字段。

为什么DataGridComboBoxColumn不适合我的任何帮助?

+0

'columnList'从哪里来?我猜是'null'或空... – 2014-10-17 12:01:59

+0

SqlConnection conn =新的SqlConnection(“服务器= ***;数据库= ***;集成安全性= true”); string [] restrictions = new string [4] {null,null,“orders”,null}; conn.Open(); var columnList = conn.GetSchema(“Columns”,restrictions).AsEnumerable()。Select(s => s.Field (“Column_Name”))。ToList(); 这足以确保columnList不为空,它有4个字符串,我甚至测试过它.. – 2014-10-17 16:55:33

回答

1

有两个问题可能涉及到。 首先是设置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对象(S)上设置的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, 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; 

选择经核准后,importMappings将包含列映射的列表 - 每个导入文件列它将包含的索引importToColumns列表中的元素,如果没有选择元素,则返回-1。

+0

现在,感谢你,我知道我的问题.. 如何实现一个DataGridTemplateColumn列标题和ComboBox在里面。 不幸的是,它已经进行了3天的研究,但没有任何东西.. – 2014-10-17 19:05:07

+0

我做了一些配置的代码,但感谢它帮了我很多。 – 2014-10-20 15:56:25

相关问题