C#创建两行,第一行是文本视图列表,第二行是梳框列表

C#创建两行,第一行是文本视图列表,第二行是梳框列表,c#,wpf,datagrid,datagridcomboboxcolumn,datagridtextcolumn,C#,Wpf,Datagrid,Datagridcomboboxcolumn,Datagridtextcolumn,我的项目是一个C#应用程序,用于将数据从excel工作表导入数据库,并提示用户手动映射数据 我需要创建两行: 第一行是一个DataGridTextColumn,其中包含excel的标题 适合 第二行是一个DataGridComboxColumn,具有数据库的列名 每个DataGridTextColumn都有一个组合框 但我面临的问题是,我无法使DataGridComboxColumn正常工作,每次启动应用程序时,第一行正常工作,但第二行为空 代码: foreach (DataRow row in

我的项目是一个C#应用程序,用于将数据从excel工作表导入数据库,并提示用户手动映射数据

我需要创建两行:

  • 第一行是一个
    DataGridTextColumn
    ,其中包含excel的标题 适合
  • 第二行是一个
    DataGridComboxColumn
    ,具有数据库的列名
  • 每个DataGridTextColumn都有一个组合框

    但我面临的问题是,我无法使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;