【问题标题】:WPF Datagrid Row Editing "ENDED" eventWPF Datagrid 行编辑“ENDED”事件
【发布时间】:2011-04-25 16:20:12
【问题描述】:

我知道 WPF 数据网格有 "RowEditEnding" 事件,但我需要在 Row 提交后触发该事件以检查新添加的行是否重复并合并重复的行。我的数据网格将“CanUserAddRow”属性设置为 True。

我正在使用扩展 ObservableCollection 的 EntityObservableCollection 来将我的实体与集合同步。因此,我考虑了 OnCollectionChanged 事件,但是一旦用户单击新项目占位符行,就会引发“InsertItem”事件,这意味着该对象仍然是空的,我无法检查是否重复。

无论如何我可以引发 RowEditEnded 事件吗?

谢谢...

【问题讨论】:

  • 可能有一些验证事件。你可以检查一下。
  • 您是否真的尝试对 CollectionChanged 进行足够的了解?内部检查可以让您知道项目何时实际插入或更新,因此您可以每次检查以及是否填写了字段然后执行更改逻辑:stackoverflow.com/questions/4587448/collectionchanged-sample。在我意识到这种方法的局限性(切换句柄然后强制提交和刷新等)之前,我投票赞成 @Mah,并且对 collectionchanged 进行了更多思考(但现在不能删除投票)

标签: wpf wpfdatagrid observablecollection


【解决方案1】:
    private void dgrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        if (this.dgrid.SelectedItem != null)
        {
            (sender as DataGrid).RowEditEnding -=dgrid_RowEditEnding;
            (sender as DataGrid).CommitEdit();
            (sender as DataGrid).Items.Refresh();
            (sender as DataGrid).RowEditEnding += dgrid_RowEditEnding;
        }
        else Return;

       //then check if the newly added row is duplicated
    }

【讨论】:

  • 这应该被选为接受的答案。谢谢马赫·本·伊萨!
  • 它非常适合我,但这是最好的答案吗?这是优化的代码吗?
  • 还有另一个问题 CellEndEdit 我对 CellEndEdit 有同样的问题。
  • 我同意@Jo-Smo:这应该是公认的答案。 msdn 建议使用调度程序来延迟调用刷新函数。这有效,但感觉很慢。我在下面的代码中发布了 vb.net 通讯员。
  • 我爱你!你救了我,这应该是正确答案
【解决方案2】:

您可以在数据网格的属性成员绑定上使用UpdateSourceTrigger=PropertyChanged。这将确保当CellEditEnding 被触发时,更新已经反映在可观察集合中。 看到这个帖子https://stackoverflow.com/a/27239243/9285072

【讨论】:

    【解决方案3】:

    我使用VS2010找到了您问题的答案

    RowEditEnding 中的条件 if (e.EditAction == DataGridEditAction.Commit) 将满足您的要求

    请看下面的代码。

    private void dataGrid1_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        if (e.EditAction == DataGridEditAction.Commit)
        {
            MessageBox.Show("asd");
        }
    }
    

    这是背后的 Xaml。

    <DataGrid AutoGenerateColumns="False" CanUserAddRows="True" Height="241" 
        RowEditEnding="dataGrid1_RowEditEnding" HorizontalAlignment="Left" 
        Name="dataGrid1" VerticalAlignment="Top" Width="573" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="name" Binding="{Binding id}" 
                Width="300">
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    【讨论】:

      【解决方案4】:

      取自@MaherBenIssa 的回答,我用它来避免添加和删除委托:

          private bool locker = true;
      
          private void dgArticles_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
          {
              if (locker)
              {
                  try{
                      locker = false;
                      (sender as DataGrid).CommitEdit(DataGridEditingUnit.Row, false);
                      ((sender as FrameworkElement).DataContext as ViewModel)?.Edit(e.Row.DataContext);
                  }
                  finally{
                     locker = true; //enable editing again
                  }
              }
          }
      

      【讨论】:

        【解决方案5】:

        尝试为您的数据网格设置 CommitEdit() 函数。我在这里用过:

        private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            this.MyDataGrid.CommitEdit(DataGridEditingUnit.Row, false);
        }
        

        【讨论】:

          【解决方案6】:

          VB.NET解决方案@MaherBenIssa的解决方案

          Private Sub dgLayer_RowEditEnding(sender As Object, e As DataGridRowEditEndingEventArgs)
          
              Dim d As DataGrid
              d = DirectCast(sender, DataGrid)
          
              RemoveHandler d.RowEditEnding, AddressOf dgLayer_RowEditEnding
          
              dgLayer.CommitEdit()
              sender.Items.Refresh()
          
              AddHandler d.RowEditEnding, AddressOf dgLayer_RowEditEnding
          
          End Sub
          

          【讨论】:

            【解决方案7】:

            也许您可以使用“CurrentCellChanged”事件。当您开始编辑单元格时也会触发这种情况,但也许您可以找到一种方法,不要总是在您的方法中执行您想做的所有事情。

            当我想检查数据网格中的更改是否实际上更改为原始值时,我遇到了同样的问题。此活动符合我的需求。

            希望我能告诉你一些新的东西。

            【讨论】:

              【解决方案8】:

              我想知道您为什么要找到引发 RowEditEnded 事件的方法; 如果你实现datagrid的RowEditEnding事件;每当您编辑一行并从该行更改焦点时,该行将被提交并引发 RowEditEnding;

              所以在 Row 提交后,RowEditEnding 将被提升并像 RowEditEnded 一样工作;

              我是否从您的文字中理解了错误?

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-08-23
                • 2011-11-10
                • 2011-09-14
                • 1970-01-01
                • 1970-01-01
                • 2011-04-21
                • 2014-05-12
                相关资源
                最近更新 更多