wpf中datagrid自动生成列,并进行字段绑定

在工作中遇见的,需要动态生成列,所以,这里随便写一个很简单的,欢迎补充,如有引用或转载,请标注说明,谢谢!!!

今天遇见一个情况,同一个功能,因为登录人员不同,显示不同的内容,为了保证扩展性,就想到了datagrid列自动生成这种情况,通过调用后台接口控制自动生成列的属性,代码比较简单,只是为了记录基础的信息,在这里写下来,欢迎同行指正

1.代码

1.1前端xaml代码

   <Window x:Class="AutoAddColumns.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="400" Width="700" Loaded="MainWindow_OnLoaded" ResizeMode="NoResize">
        <Grid HorizontalAlignment="Stretch">
            <Grid.RowDefinitions>
                <RowDefinition Height="5"/>
                <RowDefinition Height="30"/>
                <RowDefinition Height="5"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <StackPanel Orientation="Horizontal" Grid.Row="1">
                <Label Width="60" Height="28" Content="   列名称:" />
                <TextBox Width="320" ToolTip="以英文逗号隔开" x:Name="ColumnsTB" Height="28" VerticalAlignment="Center"/>
                <Button Width="60" Margin="10,0,0,0" Content="确认添加" Height="28" Click="ButtonBase_OnClick">
                    <Button.Template >
                        <ControlTemplate TargetType="{x:Type Button}" >
                            <Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="3,3,3,3">
                                <Border.Background>PowderBlue</Border.Background>
                                <ContentPresenter Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            </Border>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </StackPanel>
            <Label Grid.Row="2" Background="DarkGray"></Label>
            <Grid Grid.Row="3">
                <DataGrid x:Name="SourceDg" ColumnHeaderHeight="28" CanUserSortColumns="False" CanUserAddRows="False"
                          HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" AutoGenerateColumns="False">
                    <DataGrid.Columns>
                        <!--<DataGridTextColumn Header="第一列,界面添加" Width="100"/>-->
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
        </Grid>
    </Window>

2.2对应的xaml.cs代码

using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace AutoAddColumns
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        private int initColumnNum;
        private string bindingColumn;
        public ObservableCollection<Model> Model;
        public MainWindow()
        {
            InitializeComponent();
        }

        private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
        {
            initColumnNum = SourceDg.Columns.Count;
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            Model = new ObservableCollection<Model>();
            SourceDg.ItemsSource = null;
            //删除上次添加的列
            if (SourceDg.Columns.Count > initColumnNum)
            {
                var count = SourceDg.Columns.Count;
                for (int i = initColumnNum; i < count; i++)
                {
                    SourceDg.Columns.RemoveAt(SourceDg.Columns.Count - 1);
                }
            }
            var text = ColumnsTB.Text;
            if (string.IsNullOrEmpty(text))
            {
                //MessageBox.Show("添加列名称不能为空");
                return;
            }
            var arrayList = text.Split(',').ToArray();
            //循环遍历添加列值
            foreach (var column in arrayList)
            {
                //初始化需要绑定列的值
                bindingColumn = column;
                var dtc = new DataGridTextColumn
                {
                    Binding = new Binding(bindingColumn),
                    ElementStyle = Resources["contentCenterStyle"] as Style,
                    //ElementStyle=new Binding( DynamicResource contentLeftStyle)
                    Width = 90,
                    IsReadOnly = true,
                    Header = column,
                };
                SourceDg.Columns.Add(dtc);
            }

            Model = new ObservableCollection<Model>()
            {
                new Model() {name = "张三", age = "18", sex = "男", adress = "南充"},
                new Model() {name = "李四", age = "21", sex = "男", adress = "成都", grade = 97},
                new Model() {name = "雪雪", age = "19", sex = "女"},
            };
            SourceDg.ItemsSource = Model;
        }
    }


    public class Model
    {
        public string name { get; set; }

        public string age { get; set; }

        public string sex { get; set; }

        public decimal? grade { get; set; }

        public string adress { get; set; }
    }
}
2.生成效果图

输入的列名称用逗号隔开,分别绘制
在这里插入图片描述

3.注意事项

我这里的代码,在每一次点击添加按钮时,都会去清空上次添加的列,保证不会重复添加

界面datagrid的AutoGenerateColumns属性,这个设置成false。在datagrid的ItemsSource属性的说明中很明确的写到:在这里插入图片描述
在这里插入图片描述
datagrid.AutoGenerateColumns默认为true,如果没有在datagrid界面中重新设定,在你原来添加的列上,datagrid将自动添加temsSource绑定实体的所有属性列。大概效果图如下:
在这里插入图片描述
上面的结果图可以看出来,datagrid除了将我们输入的列名称绘制出来了,还将Model实体的所有属性均绘制了列。
所以,根据不同的情况设置AutoGenerateColumns属性,当然,我这里是不需要的。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值