C# WPF DataGrid使用,包括隔行多選
阿新 • • 發佈:2018-12-05
C# WPF DataGrid使用,包括隔行多選
xaml
<ScrollViewer VerticalAlignment="Stretch" x:Name="scrollviewer" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Disabled" TouchDown="ScrollViewer_TouchDown" TouchMove="ScrollViewer_TouchMove" TouchUp="ScrollViewer_TouchUp"> <!--<DataGrid CanUserDeleteRows="False" CanUserAddRows="False" IsReadOnly="True" SelectionUnit="FullRow" Name="datagrid" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalAlignment="Top" AutoGenerateColumns="True" Background="{x:Null}" BorderBrush="{x:Null}">--> <DataGrid AutoGenerateColumns="True" IsReadOnly="True" Name="dataGrid" Background="White" GridLinesVisibility="All" Margin="5" HorizontalAlignment="Center" CanUserAddRows="False" HeadersVisibility="Column" AlternationCount="2" BorderThickness="1" FontSize="22" SelectedCellsChanged="DataGrid_SelectedCellsChanged" Focusable="False"> <DataGrid.Columns> <DataGridCheckBoxColumn x:Name="check_col" Width="50"> </DataGridCheckBoxColumn> </DataGrid.Columns> <DataGrid.ColumnHeaderStyle> <Style TargetType="DataGridColumnHeader"> <Setter Property="Background" Value="White"></Setter> <Setter Property="BorderThickness" Value="1" /> <Setter Property="FontSize" Value="22" /> <Setter Property="Width" Value="300" /> </Style> </DataGrid.ColumnHeaderStyle> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="Background" Value="White" /> <Setter Property="BorderThickness" Value="1" /> <Setter Property="FontSize" Value="22" /> </Style> </DataGrid.RowStyle> </DataGrid> <!--</DataGrid>--> </ScrollViewer>
cs
/// <summary> /// 單元格改變事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { DataGrid dataGrid = (DataGrid)sender; int selectIndex = dataGrid.SelectedIndex; var cntr = dataGrid.ItemContainerGenerator.ContainerFromIndex(selectIndex); DataGridRow ObjRow = (DataGridRow)cntr; FrameworkElement objElement = dataGrid.Columns[0].GetCellContent(ObjRow); System.Windows.Controls.CheckBox objChk = (System.Windows.Controls.CheckBox)objElement; if (objChk.IsChecked == true) { objChk.IsChecked = false; } else { objChk.IsChecked = true; } } /// <summary> /// 建了一個CheckBox,選中則為全選表格,不選中則為不全選表格 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void CheckBox_Click(object sender, RoutedEventArgs e) { if ((bool)check_all.IsChecked) { //全選 for (int i = 0; i < this.dataGrid.Items.Count; i++) { var cntr = dataGrid.ItemContainerGenerator.ContainerFromIndex(i); DataGridRow ObjROw = (DataGridRow)cntr; if (ObjROw != null) { FrameworkElement objElement = dataGrid.Columns[0].GetCellContent(ObjROw); if (objElement != null) { //if (objElement.GetType().ToString().EndsWith("cRUID")) //{ System.Windows.Controls.CheckBox objChk = (System.Windows.Controls.CheckBox)objElement; if (objChk.IsChecked == false) { objChk.IsChecked = true; } //} } } } } else { //全不選 for (int i = 0; i < this.dataGrid.Items.Count; i++) { var cntr = dataGrid.ItemContainerGenerator.ContainerFromIndex(i); DataGridRow ObjROw = (DataGridRow)cntr; if (ObjROw != null) { FrameworkElement objElement = dataGrid.Columns[0].GetCellContent(ObjROw); if (objElement != null) { //if (objElement.GetType().ToString().EndsWith("cRUID")) //{ System.Windows.Controls.CheckBox objChk = (System.Windows.Controls.CheckBox)objElement; if (objChk.IsChecked == true) { objChk.IsChecked = false; } //} } } } } } #region 觸控式螢幕上下滑動 /// <summary> /// scrollviewer 觸控式螢幕上下滑動 /// </summary> double mPointY;//觸控點的Y座標 double mOffsetY;//滾動條當前位置 bool mIsTouch = false;//是否觸控 private void ScrollViewer_TouchDown(object sender, TouchEventArgs e) { mIsTouch = true;//正在觸控 mOffsetY = this.scrollviewer.VerticalOffset;//獲取ScrollViewer滾動條當前位置 TouchPoint point = e.GetTouchPoint(scrollviewer);//獲取相對於ScrollViewer的觸控點位置 mPointY = point.Position.Y;//觸控點的Y座標 } private void ScrollViewer_TouchMove(object sender, TouchEventArgs e) { if (mIsTouch == true)//如果正在觸控 { TouchPoint point = e.GetTouchPoint(scrollviewer);//獲取相對於ScrollViewer的觸控點位置 double DiffOffset = point.Position.Y - mPointY;//計算相對位置 this.scrollviewer.ScrollToVerticalOffset(mOffsetY - DiffOffset);//ScrollViewer滾動到指定位置 } } private void ScrollViewer_TouchUp(object sender, TouchEventArgs e) { mIsTouch = false;//觸控結束 } #endregion