WPF 关于DataGrid的样式设置+数据操作

一、关于DataGrid的样式设置

1.绑定数据格式后,默认状态格式正常,但是运行后,通过DataSet更新数据后,样式变得不正常。

默认样式情况:
在这里插入图片描述

        <!-- DataGrid列标题样式 -->
        <Style x:Key="style_DgCloumnHeader" TargetType="DataGridColumnHeader">
            <Setter Property="Background" Value="Orange" />
            <Setter Property="Foreground" Value="White" />
        </Style>
///Xaml中调用
		ColumnHeaderStyle="{DynamicResource style_DgCloumnHeader}"

运行后:
在这里插入图片描述

问题分析:

初步分析:应该是初始化的时候将格式重新覆盖了,具体什么哪里被覆盖了尚需再另外分析。

解决方案:

目前尚未找到具体根据,采用临时方案,将格式单独设置,不采用绑定方法。

                                <DataGrid.ColumnHeaderStyle>
                                    <Style TargetType="DataGridColumnHeader">
                                        <Setter Property="Background" Value="Orange"/>
                                        <Setter Property="Foreground" Value="White"/>
                                    </Style>
                                </DataGrid.ColumnHeaderStyle>

使用后样式设置正常:
在这里插入图片描述

通过绑定数据设置单元格数据格式

                                </DataGrid.ColumnHeaderStyle>
                                <!-- 注意,样式设置需要防御Columns标签内,不然会报错“在使用 ItemsSource 之前,项集合必须为空” -->
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="{x:Static res:StringResource.NO}" Binding="{Binding ID,StringFormat={}{0:D}}"/>
                                    <DataGridTextColumn Header="{x:Static res:StringResource.Type}" Binding="{Binding EventType}"/>
                                    <DataGridTextColumn Header="{x:Static res:StringResource.RawDataID}" Binding="{Binding RawDataID,StringFormat={}{0:D}}"/>
                                    <DataGridTextColumn Header="{x:Static res:StringResource.Message}" Binding="{Binding Message}"/>
                                    <DataGridTextColumn Header="{x:Static res:StringResource.UserName}" Binding="{Binding UserName }"/>
                                    <DataGridTextColumn Header="{x:Static res:StringResource.Date}" Binding="{Binding EventTime,StringFormat={}dd/MM/yyyy HH:mm:ss}"/>
                                </DataGrid.Columns>

2.设置选择模式

SelectionMode属性:

  • Single 单选
  • Extended 多选

当SelectionMode属性为Extended时,可通过设置SelectionUint属性设置更多的选中模式

  • Cell 单元格
  • CellOrRowHeader 表头
  • FullRow 整行选中

二、WPF DataGrid数据操作

1.获取选中单元格的数据

1.1 通过获取控件,然后通过控件参数获取数据

        private void Dg_list_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //识别是否有数据存在
            if (dg_list.SelectedCells[0].Column != null)
            {
                //所选内容非空时
                if (dg_list.SelectedCells[0].Column.GetCellContent(dg_list.SelectedItem) != null)
                {
                    selectedChannel.ID = Convert.ToInt32((dg_list.SelectedCells[0].Column.GetCellContent(dg_list.SelectedItem) as TextBlock).Text, FormatInfo.Number);
                    selectedChannel.Name = (dg_list.SelectedCells[1].Column.GetCellContent(dg_list.SelectedItem) as TextBlock).Text;
                    selectedChannel.Notes = (dg_list.SelectedCells[2].Column.GetCellContent(dg_list.SelectedItem) as TextBlock).Text;
                }
            }
        }

说明:

  • “as TextBlock”:获取单元格内容是,需要先将对应的单元格数据转换成对应的控件格式,然后进一步获取数据。
  • “GetCellContent”:获取单元格属性
  • “SelectedItem”:选中的单元格,增行选择时就是选中的行
  • ”SelectedCells[i]“:选中单元个的列,如0为第0列,1为第1列。

1.2 通过表格数据获取

            //识别是否有数据存在
            if (dg_UserList.SelectedItem != null)
            {
                Int32 id = Convert.ToInt32(((DataRowView)dg_UserList.SelectedItem).Row["ID"], FormatInfo.Number);
                selectedUser = PGxMySqlDB.GetUser(id);
            }
        将类型转换成DataRowView,然后通过行列获取数据。

2.设置默认选中行

//设置默认选中第一个主项目
if (dg_ItemTypeList.Items.Count > 0)
{
    dg_ItemTypeList.UpdateLayout();
    dg_ItemTypeList.ScrollIntoView(dg_ItemTypeList.Items[0]); //若不设置,则所选行超出界面时会报错
    DataGridRow row = (DataGridRow)dg_ItemTypeList.ItemContainerGenerator.ContainerFromIndex(0);
    row.IsSelected = true;
}

注意:

  1. updateLayout()方法是关键,没有调用该方法无法正常选中。

  2. 实际使用过程中,将DataGrid控件放置于TabControl控件中时会发生ContainerFromIndex(0)返回值为null的异常

    DataGridRow row = (DataGridRow)dg_UserList.ItemContainerGenerator.ContainerFromIndex(0);
    
     后面经过确认排查,确认时由于控件未进行完整加载完毕就调用所以返回值未null。
     加载完毕后通过方法调用可以正常返回。
     针对初始化问题,改用调用TabItem的GetFocus事件,再进行调用就可以正常返回。
    

参考:WPF DataGrid行加载选中第一行并改变颜色

3.添加选中列,并事件触发

xaml文件设置

<DataGridCheckBoxColumn Binding="{Binding IsChecked}">
    <DataGridCheckBoxColumn.HeaderTemplate>
         <DataTemplate>
               <CheckBox x:Name="chk_SampleExtractionList_AllSelect" Click="Chk_SampleExtractionList_AllSelect_Click"/>
         </DataTemplate>
    </DataGridCheckBoxColumn.HeaderTemplate>
</DataGridCheckBoxColumn>

后台设置

        private void Chk_SampleReceiveList_AllSelect_Click(object sender, RoutedEventArgs e)
        {
            CheckBox checkBox = sender as CheckBox;
            if (checkBox.IsChecked == true)
            {
                for (int i = 0; i < dt_SampleReceive.Rows.Count; i++)
                {
                    dt_SampleReceive.Rows[i]["IsChecked"] = true;
                }
            }
            else
            {
                for (int i = 0; i < dt_SampleReceive.Rows.Count; i++)
                {
                    dt_SampleReceive.Rows[i]["IsChecked"] = false;
                }
            }
        }

4.添加每一行是获取信息

事件:LoadingRow事件
获取行数据:

DataRow  row = (e.Row.Item as DataRowView).Row;

获取行号:

index = e.Row.GetIndex();
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼听禅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值