zoukankan      html  css  js  c++  java
  • WPF之DataGrid--列的前台及后台实现

    一、前台实现

    在xaml里可以很轻松地实现一个如下图所示的DataGrid

    <StackPanel>
            <ComboBox Width="50" HorizontalAlignment="Left" SelectionChanged="ComboBox_SelectionChanged_1">
                <ComboBoxItem Content="全部"></ComboBoxItem>
                <ComboBoxItem Content="男"></ComboBoxItem>
                <ComboBoxItem Content="女"></ComboBoxItem>
            </ComboBox>
            <DataGrid Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="False">
                <DataGrid.Columns>
                    <DataGridCheckBoxColumn>
                        <DataGridCheckBoxColumn.Header>
                            <CheckBox Click="CheckBox_Click_1"></CheckBox>
                        </DataGridCheckBoxColumn.Header>
                    </DataGridCheckBoxColumn>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Ellipse Height="10" Width="10" Fill="{Binding FillColor}"></Ellipse>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="姓名" Width="100" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTemplateColumn Header="性别" Width="100">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <RadioButton Content="男" IsChecked="{Binding IsBoy}" Margin="5"></RadioButton>
                                    <RadioButton Content="女" IsChecked="{Binding IsGirl}" Margin="5"></RadioButton>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="住址" Width="200">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Grid Name="address">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="5*"></ColumnDefinition>
                                        <ColumnDefinition Width="1*"></ColumnDefinition>
                                    </Grid.ColumnDefinitions>
                                    <TextBox Text="{Binding Address}" Grid.Column="0"></TextBox>
                                    <Button Content="Csl" Grid.Column="1" Click="Button_Click_1"
                                            Template="{StaticResource ButtonStyle}"></Button>
                                </Grid>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
            <Button Content="修改选中行的姓名" Template="{StaticResource ButtonStyle}"
                    Width="72" Height="23" Click="Button_Click_2"></Button>
        </StackPanel>

    二、几个主要的事件代码

    1、CheckBox全选、反选:

            /// <summary>
            /// 全选、反选
            /// </summary>
            /// <param name="value"></param>
            private void ChangeIsChecked(bool value)
            {
                for (int i = 0; i < this.dataGrid.Items.Count; i++)
                {
                    DataGridRow row = (DataGridRow)this.dataGrid.ItemContainerGenerator.ContainerFromIndex(i);
                    if (row != null)
                    {
                        FrameworkElement fe = this.dataGrid.Columns[0].GetCellContent(row);
                        if (fe != null)
                        {
                            CheckBox chk = fe as CheckBox;
                            if (chk.IsChecked.Value == !value)
                            {
                                chk.IsChecked = value;
                            }
                        }
                    }
                }
            }
    2、ComboBox筛选:
            private ICollectionView view;
            /// <summary>
            /// 筛选
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void ComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
            {
                this.view = CollectionViewSource.GetDefaultView(this.students);
                switch ((sender as ComboBox).SelectedIndex)
                { 
                    case 0:
                        this.view.Filter = x => true;
                        break;
                    case 1:
                        this.view.Filter = x => (x as Student).IsBoy;
                        break;
                    case 2:
                        this.view.Filter = x => (x as Student).IsGirl;
                        break;
                    default:
                        break;
                }
            }

    3、修改单元格内容:

            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                //获取指定的列
                DataGridTemplateColumn column = this.dataGrid.Columns[4] as DataGridTemplateColumn;
                //获取指定的行与列相交位置的单元格
                FrameworkElement element = column.GetCellContent(this.dataGrid.Items[this.dataGrid.SelectedIndex]);
                Grid grid = column.CellTemplate.FindName("address", element) as Grid;
                if (grid != null)
                {
                    TextBox textBox = grid.Children[0] as TextBox;
                    MessageBox.Show(textBox.Text);
                }
            }

    三、后台实现

    一般用于动态生成Column,其实现过程相对要复杂一些。如果某一列在其单元格中承载的是模板,那么其创建的流程为:

    1、创建模板FrameworkElementFactory;

    2、设置模板的依赖项属性及数据绑定,添加子项;

    3、把模板赋给DataTemplate.VisualTree;

    4、把DataTemplate赋给DataGridTemplateColumn.CellTemplate;

    5、把DataGridTemplateColumn添加到DataGrid.Columns

            /// <summary>
            /// 生成地址列
            /// </summary>
            private void CreateColumnAddress()
            {
                DataGridTemplateColumn column = new DataGridTemplateColumn()
                {
                    Header = "住址",
                    Width = 200.0
                };
                DataTemplate temp = new DataTemplate();
    
                //生成Grid
                FrameworkElementFactory grid = new FrameworkElementFactory(typeof(Grid));
                grid.Name = "address";
                //生成ColumnDefinition
                FrameworkElementFactory c1 = new FrameworkElementFactory(typeof(ColumnDefinition));
                FrameworkElementFactory c2 = new FrameworkElementFactory(typeof(ColumnDefinition));
                c1.SetValue(ColumnDefinition.WidthProperty, new GridLength(5, GridUnitType.Star));
                c2.SetValue(ColumnDefinition.WidthProperty, new GridLength(1, GridUnitType.Star));
    
                grid.AppendChild(c1);
                grid.AppendChild(c2);
    
                //生成TextBox
                FrameworkElementFactory textBox = new FrameworkElementFactory(typeof(TextBox));
                Binding binding = new Binding("Address");
                textBox.SetBinding(TextBox.TextProperty, binding);
                textBox.SetValue(Grid.ColumnProperty, 0);
    
                //生成Button
                FrameworkElementFactory button = new FrameworkElementFactory(typeof(Button));
                button.SetValue(Button.ContentProperty, "Cls");
                button.SetValue(Grid.ColumnProperty, 1);
                button.SetValue(Button.TemplateProperty, this.FindResource("ButtonStyle"));
                button.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click_1));
    
                grid.AppendChild(textBox);
                grid.AppendChild(button);
    
                temp.VisualTree = grid;
                column.CellTemplate = temp;
    
                this.dataGrid.Columns.Add(column);
            }

    四、源码

    DataGrid示例

  • 相关阅读:
    Codeforces Round #384 (Div. 2)
    Codeforces Round #383 (Div. 2)
    bzoj-4514(网络流)
    bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
    bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
    hdu-5988 Coding Contest(费用流)
    hdu-5992 Finding Hotels(kd-tree)
    用链表实现杭电1276士兵队列训练问题
    循环链表
    图书管理系统
  • 原文地址:https://www.cnblogs.com/zhou-yi/p/4727528.html
Copyright © 2011-2022 走看看