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;  

  }  

/// <summary>  

/// 私有方法 获取选中的多行  

/// </summary>  

  /// <returns></returns>  

  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;  

     }