在工作中遇见的,需要动态生成列,所以,这里随便写一个很简单的,欢迎补充,如有引用或转载,请标注说明,谢谢!!!
今天遇见一个情况,同一个功能,因为登录人员不同,显示不同的内容,为了保证扩展性,就想到了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属性,当然,我这里是不需要的。