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
dataGrid1.ScrollIntoView(后台的items.OfType<item类型>().Last())追问
试过了还是不行,红框里面是XAML前台程序。做了一个很简单的Listview
你用的究竟是listview还是datagrid?我的回答是针对后者的。
追问两个我都用了。都是出现同一个毛病。开始我用的是datagrid出现同样的问题。
追答我那代码的效果只是滚动过去,而不是选中,在很多行有滚动条的情况下才能看到作用,你说的究竟是选中还是滚动?如果是选中,下面的代码我也是测试过的
dataGrid1.SelectedIndex = ((IEnumerable)dataGrid1.ItemsSource).OfType<item类型>().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的SelectionUnit跟SelectionMode两个属性的取值不同时有变化
一:当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 默认选择为最新的一行,不知道为啥设置不了的主要内容,如果未能解决你的问题,请参考以下文章