加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:09:17 所属栏目:百科 来源:网络整理
导读:我的项目是一个C#应用程序,用于将数据从Excel工作表导入数据库,并提示用户手动映射它们. 我需要创建两行: 第一行是DataGridTextColumn,其中包含excel的标题 适合. 第二行是DataGridComboBoxColumn,其中包含数据库的column_name 每个DataGridTextColumn都有
我的项目是一个C#应用程序,用于将数据从Excel工作表导入数据库,并提示用户手动映射它们.

我需要创建两行:

>第一行是DataGridTextColumn,其中包含excel的标题
适合.
>第二行是DataGridComboBoxColumn,其中包含数据库的column_name

每个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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读