wpf datagrid 默认选择为最新的一行,不知道为啥设置不了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf datagrid 默认选择为最新的一行,不知道为啥设置不了相关的知识,希望对你有一定的参考价值。

Datagird 和listview我都是绑定数据。滚动条默认是第一行,怎么才能让其保持在最后一行显示呢?

this.dataGrid1.SelectedIndex = this.dataGrid1.Items.Count - 1;
this.dataGrid1.ScrollIntoView(dataGrid1.SelectedIndex);

this.listview.SelectedIndex = this.listview.Items.Count - 1;
this.listview.ScrollIntoView(listview.SelectedIndex);
不管用,估计是因为我的数据( ObservableCollection)是绑定的

设置断点发现this.listview.SelectedIndex总是-1或者0

参考技术A //我刚刚试过是可以的
dataGrid1.ScrollIntoView(后台的items.OfType<item类型>().Last())

追问

试过了还是不行,红框里面是XAML前台程序。做了一个很简单的Listview

追答

你用的究竟是listview还是datagrid?我的回答是针对后者的。

追问

两个我都用了。都是出现同一个毛病。开始我用的是datagrid出现同样的问题。

追答

我那代码的效果只是滚动过去,而不是选中,在很多行有滚动条的情况下才能看到作用,你说的究竟是选中还是滚动?如果是选中,下面的代码我也是测试过的

dataGrid1.SelectedIndex = ((IEnumerable)dataGrid1.ItemsSource).OfType<item类型>().Count() - 1;

追问


参考技术B this.dataGrid1.SelectedIndex = this.dataGrid1.Items.Count - 1;
this.dataGrid1.ScrollIntoView(dataGrid1.SelectedItem);
这样就好了追问

主要是this.dataGrid1.SelectedIndex = this.dataGrid1.Items.Count - 1;就算给selectimdex赋值它总是0,根本赋值不上。我试过了。我把你给的放在 dataGrid1_MouseDoubleClick事件里,双击其他行,还是默认跳回第一行。

追答

this.dataGrid1.SelectedIndex = this.dataGrid1.Items.Count - 1 别这么设置

this.dataGrid1.SelectedIndex = 数据源集合.Count - 1

追问

试过了。还是不行,我用的ObservableCollection数据源,设置断点查count输出数的都没问题,但是赋值给this.dataGrid1.SelectedIndex,它还是0.我直接 this.dataGrid1.SelectedInde=8都不行查看它还是0.貌似dataGrid1.SelectedInde就屏蔽赋值。

追答

dataGrid1.SelectedInde 赋值肯定好使,可能你哪地方代码有问题,看不到没法替你找哪错了

追问

绿字是前台程序,做了一个很简单的例子。设置断点在datagrid.selectedimdex那里永远是等于0,就算DXJK_OneJK_sREG_ceshi.Count有值也附不进去值

追答

datagrid 没绑定数据?那设置datagrid.selectedimdex 有什么意义

追问

我弄的有点乱,datagrid和listview我都用的是 observablecollection做的数据源 ,所以可能在我给出的例子的程序里会有datagrid.selectedimdex.前台是listview 。可以把datagrid.selectedimdex替换成listview.selectedimdex.这是整的我有点乱。所以两个我都试过了,出现同一个毛病

追答

集合里你就加了一条数据 selectedindex是0 正常,多加几条数据试试,要不你就上传下代码,我给你调试下。

本回答被提问者采纳
参考技术C 好好看。。。。

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

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;  

     }  

以上是关于wpf datagrid 默认选择为最新的一行,不知道为啥设置不了的主要内容,如果未能解决你的问题,请参考以下文章

EasyUI datagrid 如何默认选择多行

wpf datagrid 怎么增加数据行

怎么知道用户选择的wpf的datagrid的哪一列

停止Datagrid默认选择第一行

当 SelectionMode 设置为 Cell 时,如何突出显示 WPF DataGrid 中的一行

c# wpf datagrid中选择所有复选框的代码