1. 程式人生 > >C# WPF DataGrid使用,包括隔行多選

C# WPF DataGrid使用,包括隔行多選

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