none
如何设置当前单元格 RRS feed

  • 问题

  • wpf 中datagrid,我想做到点一个按钮到开始到一个新行开始插入新值,当前输入焦点到第一个单元格(因为此列为主键,默认情况下是不允许编辑的),但是如何获取datagrid中的具体某个单元格呢?求指教。

    还有一个问题就是,绑定数据源后删除数据要不要写代码 ?另外datagrid中绑定数据后为什么要等第二次开始编辑的时候才会保存数据?(设置了two way)绑定。


    dqjk

    • 已移动 Allen_MSDN 2012年2月23日 1:15 (发件人:ADO.NET 与 LINQ)
    2012年2月21日 12:02

答案

  • 第一个问题,你看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

    2012年2月23日 10:10
    版主
  • 你好,

    让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


    2012年2月24日 1:58
    版主

全部回复

  • 第一个问题,你看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

    2012年2月23日 10:10
    版主
  • 你好,

    让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


    2012年2月24日 1:58
    版主