欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

<WPF> Datagrid的详细用法

程序员文章站 2022-07-14 08:50:27
...

1. 前言

  • 此篇博客是为了记录在写WPF前段时遇到的一个问题,以及其解决方案。
  • 问题描述:
    前端表格数据存于Datagrid表格中,此表格于其他表格相互关联,需要将所有表格数据进行全部导出和部分导出,则需要 ①添加复选框 增加全选功能 ② 读取每行的复选框 进行判断
    由于没有学习过WPF,对于这个数据类型很陌生,所以查了很多资料,并记录下,方便今后使用的时候进行查找。

2. Datagrid

介绍

  • 来自官方的介绍:
    命名空间: System.Windows.Controls
    程序集: PresentationFramework.dll
    表示用于在可自定义的网格中显示数据的控件。
    public class DataGrid : System.Windows.Controls.Primitives.MultiSelector
    
  • 其功能强大,可以包括很多数据类型在其中,故存储采用object类型。

使用

  • 前端添加Datagrid表格项
 <!--表头样式-->
<DataGrid.ColumnHeaderStyle>
	<Style TargetType="DataGridColumnHeader">
        <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
        <Setter Property="Background" Value="Transparent"></Setter>
        <Setter Property="Foreground" Value="black"></Setter>
        <Setter Property="BorderThickness" Value="0.8" />
        <Setter Property="BorderBrush" Value="#17acae" />
        <Setter Property="FontSize" Value="18" />
    </Style>
</DataGrid.ColumnHeaderStyle>

	<!-- 绑定数据列  Bingding-->
	<DataGridTextColumn Header="证件号"  Binding="{Binding number}"/>
	<DataGridTextColumn Header="注册日期"  Binding="{Binding register_time}"/>
	<DataGridTextColumn Header="姓名"  Binding="{Binding name}"/>
	<DataGridTextColumn Header="年龄"  Binding="{Binding age}"/>
	<DataGridTextColumn Header="备注"  Binding="{Binding remark}"/>
	</DataGrid.Columns>
</DataGrid>
  • 后端增加绑定数据
//定义数据类
public class patient_form
    {
        public string patient_id { get; set; }
        public string number { get; set; }
        public string name { get; set; }
        public string age { get; set; }
        public string race { get; set; }
        public string sex { get; set; }
        public string register_time { get; set; }
        public string weight { get; set; }//体重
        public string education { get; set; }//教育
        public string work { get; set; }//工作
        public string genetic_history { get; set; }//遗传病史
        public string disease_history { get; set; }
        public string smoking { get; set; }
        public string drinking { get; set; }
        public string diatary { get; set; }
        public string nature { get; set; }
        public string remark { get; set; }
    }
public Patient_Manager(int doctor_id)
{
	//前面内容省略
    ObservableCollection<patient_form> tmp_show = new ObservableCollection<patient_form>();
	DataGrid_Info.ItemsSource = tmp_show;   //将数据传入前端的Datagrid中  赋值操作
}

对Datagrid的行和列进行操作

  • 增加列:dt.Columns.Add(dataGrid.Columns[i].Header.ToString());
  • 新建行:System.Data.DataRow row = dt.NewRow();
  • 给行赋值:row[columnsIndex] = (dataGrid.Columns[j].GetCellContent(dataGrid.Items[i]) as TextBlock).Text.ToString();
  • 把行加入到Datagrid: dt.Add(row);
  • 获取datatable的指定行指定列数据:
    对象形式获取获取组件:
object item = DataGrid_Info.CurrentCell.Item;
//然后获取DataGridTemplateColumn单元格元素
FrameworkElement element = this.DataGrid_Info.Columns[0].GetCellContent(this.DataGrid_Info.Items[i]);

string类型获取: DataGridTemplateColumn templeColumn = DataGrid_Info.Columns[0] as DataGridTemplateColumn;

增加CheckBox

  • 前端代码
<DataGrid.RowStyle></DataGrid.RowStyle>   <!-- 表格行样式-->
	<DataGrid.CellStyle></DataGrid.CellStyle>  <!-- 表格单元格样式-->
	
            <DataGrid.Columns>       <!-- 在最前面增加一列  全选按钮 作为header-->
                <DataGridTemplateColumn Header="选择" x:Uid="">
                    <DataGridTemplateColumn.HeaderTemplate>
                        <DataTemplate>
                            <CheckBox Click="CheckAll_Click" >全选</CheckBox>//
                        </DataTemplate>
                    </DataGridTemplateColumn.HeaderTemplate>

                    <DataGridTemplateColumn.CellTemplate>      <!-- 每行都增加一个复选框-->
                        <DataTemplate>
                        	<!-- 对象的名称 用于后面获取对象 设置默认不选中 -->
                            <CheckBox  Name="IsChecked" IsChecked="False">选择</CheckBox>   
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
  • 控制全选
private void CheckAll_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show((All_Click_Tag == true) ? "全部设置为非选中!!" : "全部设置为选中!!");
            All_Click_Tag = !All_Click_Tag;
            CheckBox checkbox;
            for (int row = 0; row < DataGrid_Info.Items.Count; ++row)//遍历行
            {

                //首先获取DataGridTemplateColumn所在列
                DataGridTemplateColumn templeColumn = DataGrid_Info.Columns[0] as DataGridTemplateColumn;

                if (templeColumn == null) continue;
                //MessageBox.Show(templeColumn == null ? "templeColumn为空" : "templeColumn不为空");
                object item = DataGrid_Info.CurrentCell.Item;
                //然后获取DataGridTemplateColumn单元格元素
                FrameworkElement element = this.DataGrid_Info.Columns[0].GetCellContent(this.DataGrid_Info.Items[row]);
                //MessageBox.Show(element == null ? "element为空" : "element不为空");
                //MessageBox.Show("找checkbox");
                checkbox = (CheckBox)templeColumn.CellTemplate.FindName("IsChecked", element);//出问题
                checkbox.IsChecked = All_Click_Tag;
            }
        }