2017-11-14 3 views
0

私のウィンドウにテキストボックスがあり、btn_addをクリックするとObservable Collectionにそのコンテンツが追加され、dg_VoucherDetailのソースになります。 問題: 初めて使用するとすべてが問題ありませんが、2回目の古いObservableコレクションに置き換えられます。ただし、古いコレクションに新しいアイテムを追加する場合を除き、 、編集セクションでは検索と編集のコレクションアイテムはありません。ここで がコードです:Observable Collectionアイテムが存在する場合は、アイテムを編集します。他に新しいアイテムを追加します。

private void btn_add_Click(object sender, RoutedEventArgs e) 
    { 
     _VoucherDetail = new ObservableCollection<VoucherDetail>(); 
     VoucherDetail Voucher = new VoucherDetail(); 

     if (dg_VoucherDetail.HasItems == true) 
     { 
      for (int i = 0; i < _VoucherDetail.Count; i++) 
      { 
       if (_VoucherDetail[i].LedgerID == SelectedLedgerID) 
       { 
        if (_VoucherDetail[i].DefinitiveID == SelectedDefinitiveID) 
        { 
         if (_VoucherDetail[i].Credit == Convert.ToDecimal(txt_Amount.Text)) 
          return; 
         else if (_VoucherDetail[i].Debit == Convert.ToDecimal(txt_Amount.Text)) 
          return; 
         else 
         { 
          Voucher.LedgerID = SelectedLedgerID; 
          Voucher.DefinitiveID = SelectedDefinitiveID; 
          if (radio_debit.IsChecked == true) 
          { 
           Voucher.Debit = Convert.ToDecimal(txt_Amount.Text); 
           Voucher.Credit = 0; 
          } 
          else if (radio_credit.IsChecked == true) 
          { 
           Voucher.Debit = 0; 
           Voucher.Credit = Convert.ToDecimal(txt_Amount.Text); 
          } 
          _VoucherDetail[i] = Voucher; 
         } 
        } 
        else if (_VoucherDetail[i].DefinitiveID != SelectedDefinitiveID) 
        { 
         Voucher.LedgerID = SelectedLedgerID; 
         Voucher.DefinitiveID = SelectedDefinitiveID; 
         if (radio_debit.IsChecked == true) 
         { 
          Voucher.Debit = Convert.ToDecimal(txt_Amount.Text); 
          Voucher.Credit = 0; 
         } 
         else if (radio_credit.IsChecked == true) 
         { 
          Voucher.Debit = 0; 
          Voucher.Credit = Convert.ToDecimal(txt_Amount.Text); 
         } 
         _VoucherDetail.Add(Voucher); 
        } 
       } 
       else if (_VoucherDetail[i].LedgerID != SelectedLedgerID) 
       { 
        Voucher.LedgerID = SelectedLedgerID; 
        Voucher.DefinitiveID = SelectedDefinitiveID; 
        if (radio_debit.IsChecked == true) 
        { 
         Voucher.Debit = Convert.ToDecimal(txt_Amount.Text); 
         Voucher.Credit = 0; 
        } 
        else if (radio_credit.IsChecked == true) 
        { 
         Voucher.Debit = 0; 
         Voucher.Credit = Convert.ToDecimal(txt_Amount.Text); 
        } 
        _VoucherDetail.Add(Voucher); 
       } 
      } 
     } 
     if (dg_VoucherDetail.HasItems == false) 
     { 
      Voucher.LedgerID = SelectedLedgerID; 
      Voucher.DefinitiveID = SelectedDefinitiveID; 
      if (radio_debit.IsChecked == true) 
      { 
       Voucher.Debit = Convert.ToDecimal(txt_Amount.Text); 
       Voucher.Credit = 0; 
      } 
      else if (radio_credit.IsChecked == true) 
      { 
       Voucher.Debit = 0; 
       Voucher.Credit = Convert.ToDecimal(txt_Amount.Text); 
      } 
      _VoucherDetail.Add(Voucher); 
    //   dg_VoucherDetail.Items.Add(VoucherDetail); 
     } 
     dg_VoucherDetail.ItemsSource = _VoucherDetail; 
    } 


    internal class VoucherDetail 
{ 
    public decimal LedgerID { get; set; } 
    public decimal DefinitiveID { get; set; } 
    public decimal Debit { get; set; } 
    public decimal Credit { get; set; } 
} 

答えて

0

ここでエントリがコレクション内に存在する場合は、「アップデート」のエントリの簡単な抜粋です。このスニペットではハードコードされたものがありますが、ダイナミックにするのは簡単です。

using System.Linq; 
using System.Windows; 
using System.Windows.Controls; 
using System.Collections.ObjectModel; 

namespace UpdateObservableCollection_47291451 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 

     DataGrid dg = new DataGrid(); 
     Button btn = new Button(); 
     ObservableCollection<VoucherDetail> datasource = new ObservableCollection<VoucherDetail>(); 
     public MainWindow() 
     { 
      InitializeComponent(); 
      dg.Height = 200; 
      dg.Width = 500; 
      MainGrid.Children.Add(dg);//add DataGrid to page 
      btn.Content = "Click me"; 
      btn.Click += Btn_Click; 
      btn.Height = 25; 
      btn.Width = 50; 
      MainGrid.Children.Add(btn);//add button to page 

      dg.ItemsSource = datasource;//bind grid to data 

      //create initial data records 
      for (int i = 0; i < 5; i++) 
      { 
       datasource.Add(new UpdateObservableCollection_47291451.VoucherDetail { Credit = i, Debit = i, DefinitiveID = i, LedgerID = i }); 
      } 
     } 

     private void Btn_Click(object sender, RoutedEventArgs e) 
     { 
      //if a record with DefinitiveID of 1 exist, then update the entry 
      if (datasource.FirstOrDefault(p => p.DefinitiveID == 1) != null) 
      { 
       datasource.First(p => p.DefinitiveID == 1).Credit = 1234; 
       dg.Items.Refresh(); 
      } 
      else 
      { 
       datasource.Add(new UpdateObservableCollection_47291451.VoucherDetail { DefinitiveID = 99, Credit = 99, Debit = 99, LedgerID = 99 }); 
      } 
     } 
    } 


    internal class VoucherDetail 
    { 
     public decimal LedgerID { get; set; } 
     public decimal DefinitiveID { get; set; } 
     public decimal Debit { get; set; } 
     public decimal Credit { get; set; } 
    } 


} 
+0

は素晴らしい作品、私は2週間で見てきたblaze_125最も便利なヘルプ@ありがとう –

関連する問題