积极答复者
如何设置当前单元格

问题
-
wpf 中datagrid,我想做到点一个按钮到开始到一个新行开始插入新值,当前输入焦点到第一个单元格(因为此列为主键,默认情况下是不允许编辑的),但是如何获取datagrid中的具体某个单元格呢?求指教。
还有一个问题就是,绑定数据源后删除数据要不要写代码 ?另外datagrid中绑定数据后为什么要等第二次开始编辑的时候才会保存数据?(设置了two way)绑定。
dqjk
- 已移动 Allen_MSDN 2012年2月23日 1:15 (发件人:ADO.NET 与 LINQ)
答案
-
第一个问题,你看FAQ: http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/e1907834-611e-4e38-a47f-650a42087207 通过行列索引值就能拿到Cell,通过VisualTree方式。
第二个问题:可以不要。
第三个问题: 如果你绑定了TextColumn 最好把UpdateSourceTrigger设置为PropertyChanged。 不过我还是需要看看你具体的代码是不是这样的。
Sincerely,
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Min ZhuModerator 2012年2月27日 1:26
-
你好,
让DataGrid插入新行的话,可以把DataGrid.Items cast为IEditableCollectionView并调用AddNew方法。
获取单元格会比较麻烦,因为DataGridRow和DataGrid并不提供获取单元格的方法,要直接取得单元格的话,需要调用VisualTreeHelper的方法进行遍历。
如果只是要移动焦点的话,这里有个简便的作法是直接MoveFocus。
最后通过DataGrid.BeginEditCommand进入编辑状态。
下面是一个简单的示例。
//Add New IEditableCollectionView items = dg.Items as IEditableCollectionView; object newItem = items.AddNew(); //Select and focus the new row dg.SelectedItem = newItem; //Wait for the new row to be generated dg.Dispatcher.BeginInvoke( new Action(() => { //Get the new row DataGridRow row = dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem) as DataGridRow; //Move the focus to the first cell row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); //Begin Edit DataGrid.BeginEditCommand.Execute(null, row); }),System.Windows.Threading.DispatcherPriority.Input);
据我所知,删除数据后只需要调用EF的SaveChanges进行同步即可。
DataGrid的编辑状态分2个层级。行编辑和单元格编辑。只有退出行编辑状态的时候才会对数据源进行更新。这是通过一个内置的BindingGroup完成的。这样可以实现行验证和回滚等功能。如果在具体场景中你需要改变这一特性,你可以处理CellEditEnding时间并连续调用2个DataGrid.CommitEdit方法来直接退出行编辑状态。
Min Zhu [MSFT]
MSDN Community Support | Feedback to us
- 已编辑 Min ZhuModerator 2012年2月24日 1:59
- 已标记为答案 dqjk 2012年2月26日 15:20
全部回复
-
第一个问题,你看FAQ: http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/e1907834-611e-4e38-a47f-650a42087207 通过行列索引值就能拿到Cell,通过VisualTree方式。
第二个问题:可以不要。
第三个问题: 如果你绑定了TextColumn 最好把UpdateSourceTrigger设置为PropertyChanged。 不过我还是需要看看你具体的代码是不是这样的。
Sincerely,
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Min ZhuModerator 2012年2月27日 1:26
-
你好,
让DataGrid插入新行的话,可以把DataGrid.Items cast为IEditableCollectionView并调用AddNew方法。
获取单元格会比较麻烦,因为DataGridRow和DataGrid并不提供获取单元格的方法,要直接取得单元格的话,需要调用VisualTreeHelper的方法进行遍历。
如果只是要移动焦点的话,这里有个简便的作法是直接MoveFocus。
最后通过DataGrid.BeginEditCommand进入编辑状态。
下面是一个简单的示例。
//Add New IEditableCollectionView items = dg.Items as IEditableCollectionView; object newItem = items.AddNew(); //Select and focus the new row dg.SelectedItem = newItem; //Wait for the new row to be generated dg.Dispatcher.BeginInvoke( new Action(() => { //Get the new row DataGridRow row = dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem) as DataGridRow; //Move the focus to the first cell row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); //Begin Edit DataGrid.BeginEditCommand.Execute(null, row); }),System.Windows.Threading.DispatcherPriority.Input);
据我所知,删除数据后只需要调用EF的SaveChanges进行同步即可。
DataGrid的编辑状态分2个层级。行编辑和单元格编辑。只有退出行编辑状态的时候才会对数据源进行更新。这是通过一个内置的BindingGroup完成的。这样可以实现行验证和回滚等功能。如果在具体场景中你需要改变这一特性,你可以处理CellEditEnding时间并连续调用2个DataGrid.CommitEdit方法来直接退出行编辑状态。
Min Zhu [MSFT]
MSDN Community Support | Feedback to us
- 已编辑 Min ZhuModerator 2012年2月24日 1:59
- 已标记为答案 dqjk 2012年2月26日 15:20