精华内容
下载资源
问答
  • wpf动态列datagrid

    2019-03-22 08:52:18
    wpf 带有动态列datagrid
  • WPFDataGrid 动态增加

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

    在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;
        }

     

    展开全文
  • WPF DataGrid 动态列 总结

    千次阅读 2019-03-22 09:13:06
    特殊情况下会遇到做一个带有动态列DataGrid(比如前面几列固定 后面数不固定),这里用一个第一固定,column1往后不确定作为示例简单记录一下。 首先给一个字符串数组(也有可能是复杂的类集合,这里简单地...

    特殊情况下会遇到做一个带有动态列的DataGrid(比如前面几列固定 后面列数不固定),这里用一个第一列固定,column1往后不确定作为示例简单记录一下。

    首先给一个字符串数组(也有可能是复杂的类集合,这里简单地以数组为例):

    private static string[] dynamicColumns;
    

    DataGrid将以这个数组的元素个数,自动生成列,并绑定数据。

    再来给数组赋一下值:

    dynamicColumns = new string[6] { "Column1", "Column2", "Column3", "Column4", "Column5", "Column6" };//假设6列

    前端给一个DataGrid:

    <DataGrid x:Name="grid" ItemsSource="{Binding}" AutoGenerateColumns="False"></DataGrid>

    接下来用一个例子来模拟测试一下:

    首先创建一个实体类,作为datagrid的每行数据类型:

        public class NewTestItem
        {
            private string idOrDescription;
    
            public string IdOrDescription
            {
                get { return idOrDescription; }
                set
                {
                    idOrDescription = value;
                }
            }
    
            private string column1;
    
            public string Column1
            {
                get { return column1; }
                set { column1 = value; }
            }
    
            private string column2;
    
            public string Column2
            {
                get { return column2; }
                set { column2 = value; }
            }
    
            private string column3;
    
            public string Column3
            {
                get { return column3; }
                set { column3 = value; }
            }
    
            private string column4;
    
            public string Column4
            {
                get { return column4; }
                set { column4 = value; }
            }
    
            private string column5;
    
            public string Column5
            {
                get { return column5; }
                set { column5 = value; }
            }
        }

    根据dynamicColumns数组生成这个datagrid:

    private void GenerateGrid(object obj)
    {
        object[] array = (object[])obj;
        grid = array[0] as DataGrid;
    
        var columnIdOrDescription = new DataGridTextColumn();
        columnIdOrDescription.Header = "Project";
        columnIdOrDescription.Binding = new Binding("IdOrDescription");
        columnIdOrDescription.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
        columnIdOrDescription.CellStyle = null;
        grid.Columns.Add(columnIdOrDescription);
    
        for (int i = 0; i < dynamicColumns.Length; i++)
        {
            var column = new DataGridTextColumn();
            column.Header = dynamicColumns[i];
            column.Binding = new Binding(dynamicColumns[i]);
            column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
            grid.Columns.Add(column);
        }
    
        grid.SetBinding(DataGrid.ItemsSourceProperty,"Items");
    }

    完整的代码地址

     

    展开全文
  • WPF动态添加行列DATAGRID

    热门讨论 2013-04-28 10:28:56
    WPF DataGrid 动态添加 行列 比较靠谱的,可以看看,通俗易懂
  • WPF动态添加行列DATAGRID.zip
  • WPF Datagrid 动态生成 并绑定数据

    千次阅读 2019-10-09 11:10:35
    说的是这里 因为头是动态加载的 (后台for循环 一会能看到代码) 数据来源于左侧 左侧数据源 当然num1 属于...WPF 动态生成对象属性 (dynamic) ObservableCollection<NameList> listName = new O...

    说的是这里 因为列头是动态加载的 (后台for循环 一会能看到代码) 

     数据来源于左侧列 

    左侧列数据源 当然num1 属于临时的dome使用  可以用ObservableCollection集合代表 动态创建属性

    WPF 动态生成对象属性 (dynamic)

            ObservableCollection<NameList> listName = new ObservableCollection<NameList>();
            private ObservableCollection<NameList> GetNameData()
            {
    
    
                listName.Add(new NameList("市川 賞子", "リーダー", "B", 1, "2", "14", "r1", "R5", "T6"));
                listName.Add(new NameList("石田", "リーダー", "C", 2, "33", "T4", "r2", "R5", "T6"));
                listName.Add(new NameList("安达 鮎美", "リーダー", "C", 3,"3","4","r1","R6","T6"));
    
                return listName;
    
            }
    
        }
            public class NameList : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
    
            public NameList(string name, string jOb, string class_, int num, string n1, string n2, string n3, string n4, string n5) { Name = name; Class_ = class_; JOb = jOb; Num = num; Num1 = n1; Num2 = n2; Num3 = n3; Num4 = n4; Num5 = n5; }
            private string name;
    
            public string Name
            {
                get { return name; }
                set
                {
                    name = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                    }
    
                }
            }
            private int num;
    
            public int Num
            {
                get { return num; }
                set
                {
                    num = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Num"));
                    }
                }
            }
            private string class_;
    
            public string Class_
            {
                get { return class_; }
                set
                {
                    class_ = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Class_"));
                    }
                }
            }
    
    
    
            private string jOb;
    
            public string JOb
            {
                get { return jOb; }
                set
                {
                    jOb = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("JOb"));
                    }
                }
            }
    
            private string num1;
    
            public string Num1
            {
                get { return num1; }
                set { num1 = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Num1"));
                }
                }
            }
            private string num2;
    
            public string Num2
            {
                get { return num2; }
                set { num2 = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Num2"));
                }
                }
            }
            private string num3;
    
            public string Num3
            {
                get { return num3; }
                set { num3 = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Num3"));
                }
                }
            }
            private string num4;
    
            public string Num4
            {
                get { return num4; }
                set { num4 = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Num4"));
                }
                }
            }
            private string num5;
    
            public string Num5
            {
                get { return num5; }
                set { num5 = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Num5"));
                }
                }
            }
    
        }

    列数据动态生成 与数据绑定

    public MainWindow()
            {
                InitializeComponent();
               
                addColumn();
                dataGrid.ItemsSource = GetNameData();
            }
    
            List<string> LS = new List<string>();
    
            public void addColumn() 
            {
                LS.Add("表下カップ綿天竺仮縫い_37s_C_1");
                LS.Add("上カップマーキしつけ_28s_C_2");
                LS.Add("上下カップ接ぎ_33s_C_3");
                LS.Add("上下カップ押え_62s_B_4");
                LS.Add("カップ脇しつけ_14s_B_5");
                LS.Add("表上カップレース端押さえ_41s_B_6");
    
                for (int i = 0; i < LS.Count; i++)
    			{ 
                     DataGridTextColumn dl = new DataGridTextColumn();
                    dl.Header=LS[i];
                  
                    dl.Binding = new Binding("Num" + (i + 1) );
                    dataGrid.Columns.Add(dl);
    			}
            
            }

    主要是 bingding 这一行 

    需要知道这俩块怎么做的朋友 可以看连接

    WPF (DataGridColumnHeader)实现自义定列头样式 并绑定数据

    WPF (DataGridRowHeaderStyle)实现自义定行样式 并绑定数据

    展开全文
  • MVVM实现WPFDataGrid动态列与编辑器

    热门讨论 2011-01-12 22:44:42
    使用MVVM模式对WPF中的DataGrid控件动态添加,并实现了编辑模式。
  • WPF DataGrid 动态列绑定

    千次阅读 2019-05-24 17:23:15
    WPF DataGrid 动态列绑定 代码: <Grid> <DataGrid Name ="dataGrid" HeadersVisibility="Column" ItemsSource="{Binding}" DisplayMemberPath="Data" CanUserAddRows =" Fal...

    WPF DataGrid 动态列绑定

    代码:

    <Grid>
        <DataGrid Name ="dataGrid"  HeadersVisibility="Column"  
                  ItemsSource="{Binding}" DisplayMemberPath="Data"  
                  CanUserAddRows =" False"
                  AutoGenerateColumns="False" />
    </Grid>
    
    
    public partial class MainWindow : Window
    {
        private ObservableCollection<string[]> _obervableCollection = new ObservableCollection<string[]>();
    
        public MainWindow()
        {
            InitializeComponent();
            addColumns();
            addRow();
        }
    
        void addColumns()
        {
            for (int i = 0; i < 3; i++)
            {
                this.dataGrid.Columns.Add(new DataGridTextColumn() { Header = "Row" + i, Binding = new Binding("[" + i.ToString() + "]") });
            }
    
            dataGrid.IsReadOnly = true;
            dataGrid.ItemsSource = _obervableCollection;
        }
    
        void addRow()
        {
            string[] list1 = new string[3] { "1", "2", "3" };
            _obervableCollection.Add(list1);
    
            string[] list2 = new string[3] { "4", "5", "6" };
            _obervableCollection.Add(list2);
    
            string[] list3 = new string[3] { "7", "8", "9" };
            _obervableCollection.Add(list3);
        }
    }
    
    展开全文
  • wpfdatagrid动态设置单元格背景颜色。
  • 有时文本太长会显示不全,添加模板 控制自适应换行。主要针对wpfdatagrid列的显示,通过添加模板的方式绑定数据源从而实现自动换行。
  • 添加数据 /// /// 列名 /// 显示列名 /// 填充的数据 public void AddColumn( string columnName, string Header, List< string > vs) { int i = 0 ; int ...
  • WPFDataGrid动态生成

    千次阅读 2019-04-16 10:46:14
    在XMAL的WIndow中,定义一个x:Nam ="dataShow"的DataGrid控件 后台,在Load事件中,可以这样写 dataPage.dataShow.Columns.Clear();//每次清空集合 string tempStr = String.Empty ; for ...
  • //创建DataGridTemplateColumn var column= new DataGridTemplateColumn(); column.CanUserResize = false; column.CanUserReorder = false; column.Header = ""; //创建FrameworkElementFactory ...
  • WPF中的DataGrid合并单元格,模板内嵌套DataGrid,非真正合并
  • 由于最近有这方面的需求,而且刚接触wpf不久,在网上找了很多方法,都不是使用MVVM模式的,因为DataGrid不能绑定 这就难受了,我想了个折中的方法,这个是使用了MVVMLight的消息机制,我就不说太多了,直接上...
  • wpf 动态合并datagrid表头单元格

    热门讨论 2014-12-11 22:35:41
    wpf 动态合并datagrid表头单元格
  • WPF 动态生成DataGrid

    2020-12-03 09:40:52
    动态生成DataGrid,包括分页、checkbox、动态绑定数据动态生成按钮并绑定事件、允许泛型数据类 最新效果图: 效果如下: 使用只需要配置即可: <datagridwithpages:DataGridWithPage Grid.Row="0" Name=...
  • 一、后台动态生成DataGrid 1 HistoricalDataDG.Columns.Clear(); 2 HistoricalDataDG.Columns.Add(new DataGridTextColumn() { Header = "时间", ElementStyle = (System.Windows.Style)FindResource(...
  • WPF 动态加载DataGrid

    2021-01-08 11:32:01
    言归正传,所谓动态加载DataGrid就是说表头和数据都是动态生成出来的,不是预先设置好的值。 在网上也找了很久这方面的资料,然后功夫不负有心人还是找到了,然后写一下自己在做的过程中的一些方法和心得。 先说明...
  • DataGrid模板自定义控件使用,依赖属性的绑定
  • 现在需要根据数据库一张表中的数据字段(例如Students表中的Name字段)在这个DataGrid动态添加。并实现前端根据Students表实时进行更新。 代码: <DataGrid ItemsSource="{Binding Schools,...
  • WPF DataGrid 去掉空白

    2020-11-03 14:16:14
    设置最后一的Width="*" <DataGrid Name="dgBuild" ItemsSource="{Binding}" HorizontalScrollBarVisibility="Hidden" AutoGenerateColumns="False" CanUserReorderColumns="False" HeadersVisibility="None" ...
  • WPF datagrid 按钮使用

    千次阅读 2019-09-26 05:29:55
    原文:WPF中使用DataGrid时操作按钮问题 <DataGrid x:Name="datagrid"AutoGenerateColumns="False"ScrollViewer.HorizontalScrollBarVisibility="Hidden"SizeChanged="datagrid_SizeChanged"RowHeader...
  • WPF DataGrid 拖拽实现

    2016-11-16 23:38:51
    WPF DataGrid 拖拽实现
  • wpf datagrid排序列表头文字右边的升降箭头Demo,下载下来用VS2019编辑即可执行!!
  • WPF 使用MVVM设计模式对进行增删改操作 具体内容可以看我的博客:https://blog.csdn.net/Dear200892/article/details/100917939
  • wpf实现DataGrid列表控件实现树形结构,并且展开控件ToggleButton可以放在任意一,也可以冻住多不可拖动。
  • < DataTrigger Binding =" {Binding RelativeSource={RelativeSource Self}, Path=Column....上面的是datagrid第一的单元格背景色根据值改变。 转载于:https://www.cnblogs.com/czly/p/11190695.html
  • WPF DataGrid标题样式设计 能够换行 1.定义样式 <DataTemplate x:Key="HeaderTemplateCenterAlign"> <Border> <TextBlock TextWrapping="Wrap" Text="{Binding Path=Content, Rel...
  • 针对 DataGrid 控件,对数据进行分组、排序和筛选....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,679
精华内容 3,071
关键字:

datagridwpf动态列