WPF DataGrid 获取选中 一行 或者 多行

我现在是一名学生,很喜欢编程。从csdn博客学到很多东西,最近在看WPF的一些知识,把自己看到的分享给大家。这是我的第一篇博客,希望与大家多多交流,也请大家多多指教。

WPF中DataGrid使用时,需要将其SelectedItem转换成DataRowView进行操作

然而SelectedItem SelectedItems DataGrid的SelectionUnitSelectionMode两个属性的取值不同时有变化

一:当DataGrid.SelectionUnit == DataGridSelectionUnit.FullRow时,获取选中一行与多行的方法:

1选中多行

  int count = DataGrid.SelectedItems.Count;
            DataRowView[] drv = new DataRowView[count];
            for (int i = 0; i < count; i++)
            {
                drv[i] = DataGrid.SelectedItems[i] as DataRowView;
            }
            return drv;

2选中一行

DataGrid.SelectedItem as DataRowView

二:但是当DataGrid.SelectionUnit 的属性是Cell或者CellOrRowHeader时,并且SelectionMode的值为 Extented时,这样处理就不太好。因为如果选中的是 cell 则SelectedItem的值为null。所以可以通过Cell来统一处理,无论SelectionUnit 的值是什么,总有选中的单元格,通过单元格确定该行。

   private DataRowView GetSelectedRow()
        {
           


            /*优化 
             * 无论 DataGrid的SelectionUnit跟SelectionMode两个属性取任何值
             * 都存在选中的单元格
             * 可以根据选中的单元格做统一处理,获取选中的行
             *  GetSelectedRows()方法获取选中多行原理相同
            */

            if (DataGrid != null && DataGrid.SelectedCells.Count != 0)
            {
                //只选中一个单元格时:返回单元格所在行
                //选中多个时:返回第一个单元格所在行
                return DataGrid.SelectedCells[0].Item as DataRowView;
            }

            return null;
        }
        /// 
        /// 私有方法 获取选中的多行
        /// 
        /// 
        private DataRowView[] GetSelectedRows()
        {
            //当选中有多个单元格时,获取选中单元格所在行的数组
            //排除数组中相同的行
            if (DataGrid!=null&&DataGrid.SelectedCells.Count > 0)
            {
                DataRowView[] dv = new DataRowView[DataGrid.SelectedCells.Count];
                for (int i = 0; i < DataGrid.SelectedCells.Count; i++)
                {
                    dv[i] = DataGrid.SelectedCells[i].Item as DataRowView;

                }
                //因为选中的单元格可能在同一行的,需要排除重复的行
                return dv.Distinct().ToArray();
            }
            return null;

        }

三 对DataGrid的封装。面向对象理解的不好,希望大家多提意见。 谢谢!


public class MyDataGrid
    {
        #region 构造函数
        /// 
        /// 基本构造函数
        /// 
        /// 当前DataGrid对象
        public MyDataGrid(DataGrid aDataGrid)
        {
            //清空变量值
            Clear();
            //接受传入参数
            DataGrid = aDataGrid;

            //SelectedRow = DataGrid.SelectedItem as DataRowView;
            //获取选中的一行
            SelectedRow = GetSelectedRow();
            //获取选中的多行
            SelectedRows = GetSelectedRows();
            //获取当前编辑行
            EditRow = GetEditRow();



        }


        #endregion
        #region 属性
        private DataGrid DataGrid = null;
        /// 
        /// DataGrid 中当前编辑行
        /// 
        public DataRowView EditRow = null;
        /// 
        /// DataGrid 中当前选中行
        /// 
        public DataRowView SelectedRow = null;

        /// 
        /// DataGrid 中当前选中的多行
        /// 
        public DataRowView[] SelectedRows = null;
        ///// 
        ///// DataGrid中已经删除的行
        ///// 
        //public DataRowView[] DeleteRows = null;
        #endregion

        #region 私有方法 功能方法
        /// 
        /// 私有方法 获取当前编辑行
        /// 
        /// 
        private DataRowView GetEditRow()
        {
           
                /*首先获取当前所有选中的行
                *判断是否有行处于编辑状态
                *若存在则返回,否咋 返回 null
                */

                if (DataGrid != null)
                {
                    DataRowView[] drvArray = GetSelectedRows();
                    if (drvArray != null)
                    {
                        foreach (DataRowView adrv in drvArray)
                        {
                            if (adrv.IsEdit)
                            {
                                return adrv;
                            }

                        }
                    }
                }
           
            return null;
        }

        private DataRowView GetSelectedRow()
        {
           


            /*优化 
             * 无论 DataGrid的SelectionUnit跟SelectionMode两个属性取任何值
             * 都存在选中的单元格
             * 可以根据选中的单元格做统一处理,获取选中的行
             *  GetSelectedRows()方法获取选中多行原理相同
            */

            if (DataGrid != null && DataGrid.SelectedCells.Count != 0)
            {
                //只选中一个单元格时:返回单元格所在行
                //选中多个时:返回第一个单元格所在行
                return DataGrid.SelectedCells[0].Item as DataRowView;
            }

            return null;
        }
        /// 
        /// 私有方法 获取选中的多行
        /// 
        /// 
        private DataRowView[] GetSelectedRows()
        {
            //当选中有多个单元格时,获取选中单元格所在行的数组
            //排除数组中相同的行
            if (DataGrid!=null&&DataGrid.SelectedCells.Count > 0)
            {
                DataRowView[] dv = new DataRowView[DataGrid.SelectedCells.Count];
                for (int i = 0; i < DataGrid.SelectedCells.Count; i++)
                {
                    dv[i] = DataGrid.SelectedCells[i].Item as DataRowView;

                }
                //因为选中的单元格可能在同一行的,需要排除重复的行
                return dv.Distinct().ToArray();
            }
            return null;

        }

        #endregion

        #region 通用私有方法
        /// 
        /// 清空值
        /// 
        private void Clear()
        {
            if (EditRow != null)
            {
                EditRow = null;
            }

            if (SelectedRow != null)
            {
                SelectedRow = null;
            }
            if (SelectedRows != null)
            {
                SelectedRows = null;
            }
        }
        #endregion
    }



你可能感兴趣的:(.net技术)