在datagrid中更改数据时更新数据表

时间:2013-06-21 14:11:09

标签: wpf binding datagrid datatable

我是WPF的新人,有几天我无法找到问题的答案。请指出有用的链接...

我有一个绑定到数据网格的数据表。

public  class Customers:INotifyPropertyChanged
  private DataTable _contacts;
      public DataTable Contacts
      {
          get { return _contacts; }

          set
          {
              _contacts = value;
              OnPropertyChanged("Contacts"); 
          }
      }
       public Customers() 
      {
          RaisePropertyChanged("Contacts");
      }
       public event PropertyChangedEventHandler PropertyChanged;
      public void OnPropertyChanged(string propertyName)
      {
          if (PropertyChanged != null)
          {
              PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
          }
      }
      public void RaisePropertyChanged(string propertyName)
      {
          if (this.PropertyChanged != null)
              this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
          if(string.Compare(propertyName,"Contacts")==0)
          {
             var CustomerContacts = new CustomerContactsTable();
                                  if (Id != null)
                                      CustomerContacts.GetTableByCustomerId(Id);
                                  Contacts = CustomerContacts;
                                  //..here is logic for other properties..
          }         

      }

这是xaml:

<DataGrid ItemsSource="{Binding Path=Contacts}" TargetUpdated="dgContacts_TargetUpdated">
            <DataGrid.Columns>

                <DataGridTextColumn Binding="{Binding Name,NotifyOnTargetUpdated=True}" ClipboardContentBinding="{x:Null}" />
                <DataGridTextColumn Binding="{Binding TelNo,NotifyOnTargetUpdated=True}" ClipboardContentBinding="{x:Null}" />                
            </DataGrid.Columns>
        </DataGrid>

我不知道如何更好地将数据更新到数据库中。我想获得两个指定数据行列表:列表包含更新的行(在新行内)和列表包含已删除的行。我想整行而不是细胞。而且我没有使用DataTableAdapter。 datagrid中的任何更改都不会立即提供sourcecollection的更新。 最好使用什么事件(OnTargetUpdated,RowEditEnding等)? 请不要打扰我。提前谢谢!

2 个答案:

答案 0 :(得分:2)

您可以从数据集中检索已修改或已删除的行

var modifiedRows = Contacts.GetChanges(DataRowState.Modified);
var deletedRows = Contacts.GetChanges(DataRowState.Deleted);

考虑作为替代方法,创建一个实现INotifyPropertyChanged的新ContactViewModel类。使用此类作为数据表中每行的表示。

答案 1 :(得分:1)

我认为最好将ObservableCollection而不是DataTable绑定到Datagrid以通知插入或删除。

在我用来解决类似问题的解决方案下面的链接中,虽然另外我还需要更新绑定对象的属性值。希望它有所帮助...

Datagrid Binding with specialized ObservableCollection that updates item changes

的奥斯卡