【问题标题】:Observable Collection Edit items if exists else add new oneObservable Collection 如果存在则编辑项目,否则添加新项目
【发布时间】:2017-11-15 03:00:41
【问题描述】:

我的窗口中有一些文本框,点击 btn_add 后它们的内容将被添加到 Observable Collection 中,然后将成为 dg_VoucherDetail 的来源。 问题是: 当我第一次使用它时一切都很好,但第二次它只是替换旧的 Observable 集合,除了向旧集合添加新项目, 对于编辑部分,集合中没有要搜索和编辑的项目。 这是代码:

    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; }
}

【问题讨论】:

    标签: c# wpf observablecollection


    【解决方案1】:

    这是一个简单的 sn-p,如果条目存在于集合中,它会“更新”条目。这个 sn-p 有一些东西是硬编码的,但让它动态化应该是微不足道的。

    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; }
        }
    
    
    }
    

    【讨论】:

    • 谢谢@blaze_125,这是我在 2 周内看到的最有用的帮助,效果很好
    猜你喜欢
    • 2017-01-31
    • 2019-11-23
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2022-01-18
    • 2011-10-15
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多