WPF中DataGrid 动态增加列

在WPF的项目中希望给DataGrid动态添加列,而不是添加行。例如,现有的列名是“规则一”、“规则二”,他们希望能够不断添加新的规则(每按一次键添加新的一列),然后再在DataGrid里输入、修改。就是要像Access一样。

WPF中所有的ItemsControl只支持一维的数据结构,简单理解,我们熟悉的ListBox,ListView, ComboBox, 甚至DataGrid 都是仅支持一个维度的集合。为啥DataGrid有行和列? 其实是一个维度嵌套在另一个维度中,就能够形成二维的集合结构,但是对于DataGrid来说,对于它能够直接操作的还是第一维的DataGridRow。 我们集合中每一行元素或者讲每一个元素都是会被一个 DataGridRow包装好放入DataGrid。 然后在DataGridRow还会有进一步的每个元素的各个属性的包装 DataGridCell。在WPF中,DataGrid的可视树中是根本没有所谓列的概念的,只有行和单元格的概念。所以要动态添加列,只有在DataGrid没有显示前增加,即在DataGrid的逻辑树里面增加。 或者我们可以动态增加DataGrid所绑定的DataTable的列,然后重新设置DataGrid的绑定,让DataGrid重新根据数据源来自动生成列。

不过这里也有一种方式,ObservableCollection集合里面是一个dynamic类型,它可以动态的添加属性,这种类型添加好属性之后,重新设置DataGrid的ItemsSource绑定即可,这种方式很多地方可以找到,代码如下:

 ObservableCollection<dynamic> items = new ObservableCollection<dynamic>();
    public MainWindow()
    {
      InitializeComponent();
 
      for (int i = 0; i < 5; i++)
      {
        dynamic item = new DynamicObjectClass();
        item.A = "Property A value - " + i.ToString();
        item.B = "Property B value - " + i.ToString();
        items.Add(item);
      }
 
      dataGrid.Columns.Add(new DataGridTextColumn() {Header="A", Binding = new Binding("A") });
      dataGrid.Columns.Add(new DataGridTextColumn() {Header="B", Binding = new Binding("B") });
      dataGrid.ItemsSource = items;
    }
 
    private void AddData_Click(object sender, RoutedEventArgs e)
    {
      dynamic item = new DynamicObjectClass();
      item.A="New Item - A";
      item.B="New Item - B";
      items.Add(item);
    }
 
    int newColumnIndex = 1;
    private void AddColumn_Click(object sender, RoutedEventArgs e)
    {
      foreach (DynamicObjectClass item in items)
      {
        item.TrySetMember(new SetPropertyBinder("NewColumn" + newColumnIndex), "New Column Value " + newColumnIndex.ToString());
      }
 
      dataGrid.Columns.Add(new DataGridTextColumn() { Header = "New Column" + newColumnIndex, Binding = new Binding("NewColumn" + newColumnIndex) });
 
      newColumnIndex++;
    }

对应的类及对象如下,每次新增列为属性NewColumn及其对应值:

item

A->Property A value 0

B->Property B value 0

NewColumn1-->New Value1

 

item

A->Property A value 1

B->Property B value 1

NewColumn1-->New Value1

 

item

A->Property A value 2

B->Property B value 2

NewColumn1-->New Value1

item

A->Property A value 3

B->Property B value 3

NewColumn1-->New Value1

item

A->Property A value 4

B->Property B value 4

NewColumn1-->New Value1

 

通过以上也发现,实际上新增的列为item列表下中对象的属性及其值,如果以此看做一列的话,实际上操作的还是item对应的一行。所以,也有第二种方式,即选择DataTable作为数据源,在DataTable里面动态增加了列之后,重新构造每一行数据,设置DataGrid.ItemsSource = null; 然后再重新设置ItemsSource到DataTable。代码大致如下:

  DataTable dt = new DataTable();
    public MainWindow()
    {
      InitializeComponent();
 
      dt.Columns.Add(new DataColumn("Column1"));
      dt.Columns.Add(new DataColumn("Column2"));
 
      DataRow dr;
      for (int i = 0; i < 5; i++)
      {
        dr = dt.NewRow();
        for (int columIndex = 0; columIndex < dt.Columns.Count ; columIndex++)
          dr[columIndex] = i.ToString() + " - " + columIndex.ToString();
        dt.Rows.Add(dr);
      }
 
        dataGrid.ItemsSource = dt.DefaultView;
    }
 
    private void AddData_Click(object sender, RoutedEventArgs e)
    {
      DataRow dr = dt.NewRow();
      for (int columIndex = 0; columIndex < dt.Columns.Count; columIndex++)
        dr[columIndex] = "New Row - " + columIndex.ToString();
      dt.Rows.Add(dr);
    }
 
    int newColumnIndex = 1;
    private void AddColumn_Click(object sender, RoutedEventArgs e)
    {
      dt.Columns.Add(new DataColumn("New Column" + newColumnIndex++));
      for (int i = 0; i < dt.Rows.Count; i++)
      {
        dt.Rows[i][dt.Columns.Count - 1] = i.ToString() + " - New Column";
      }
      dataGrid.ItemsSource = null;
      dataGrid.ItemsSource = dt.DefaultView;
    }

 

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVVM是一种软件架构模式,用于将用户界面的逻辑与数据分离,以便更好地管理和维护代码。在WPF,可以使用MVVM模式来实现DataGrid动态和编辑器。 首先,我们可以创建一个ViewModel类,该类将持有DataGrid的数据和信息。我们可以使用ObservableCollection<T>来存储数据,这样当数据发生变化时,DataGrid会自动更新。 然后,我们可以在ViewModel定义一个命令,用于处理用户对DataGrid的数据进行编辑的操作。当用户点击编辑按钮时,命令会被调用,并传递要编辑的数据作为参数。 接下来,我们可以在View使用DataGrid来展示ViewModel的数据。通过绑定DataGrid的ItemsSource属性到ViewModel的数据集合,可以实现动态的效果。当ViewModel的数据发生变化时,DataGrid会自动刷新。 在DataGrid定义,我们可以使用DataGridTemplateColumn来定义自定义的编辑器。通过绑定该的CellTemplate和CellEditingTemplate属性到ViewModel的编辑器,在用户编辑数据时,可以使用自定义的编辑器来展示和保存数据。 最后,我们需要将View与ViewModel进行绑定,以实现数据的双向同步。可以使用DataBinding来将ViewModel的属性与View控件进行绑定,这样当属性发生变化时,控件会自动更新,并且当用户对控件进行操作时,属性也会相应地更新。 总而言之,使用MVVM模式可以将DataGrid动态和编辑器实现得更加灵活和可维护。通过将数据和逻辑分离,我们可以更好地组织代码,并实现更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值