文章目录

  • 一、关于DataGrid的样式设置
  • 1.绑定数据格式后,默认状态格式正常,但是运行后,通过DataSet更新数据后,样式变得不正常。
  • 问题分析:
  • 解决方案:
  • 通过绑定数据设置单元格数据格式
  • 2.设置选择模式
  • 二、WPF DataGrid数据操作
  • 1.获取选中单元格的数据
  • 1.1 通过获取控件,然后通过控件参数获取数据
  • 1.2 通过表格数据获取
  • 2.设置默认选中行
  • 注意:
  • 参考:[WPF DataGrid行加载选中第一行并改变颜色](https://tieba.baidu.com/p/6206975821?red_tag=1513797591)
  • 3.添加选中列,并事件触发
  • 4.添加每一行是获取信息


一、关于DataGrid的样式设置

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

默认样式情况:

WPF ListBoxItem 样式 wpf listview datagrid_datagrid

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

运行后:

WPF ListBoxItem 样式 wpf listview datagrid_其他_02

问题分析:

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

解决方案:

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

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

使用后样式设置正常:

WPF ListBoxItem 样式 wpf listview datagrid_控件_03

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

</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();