【问题标题】:data grid in wpf wont update itself no matter whatwpf中的datagrid无论如何都不会自我更新
【发布时间】:2020-09-29 19:07:56
【问题描述】:

所以我想使用 linq to sql 将 obj 插入到 sql 表中,当我提交更改时,网格视图无论如何都不会自行更新 它首先显示数据,但新的 obj 不会显示 数据来自 dbml,

我真的很感激你的手

namespace Wpf_Main_Storage
{
    public partial class SellWindow : Window
    {
        public ObservableCollection<Sell_factor> TableData { get; }

        public SellWindow()
        {
            InitializeComponent();
            this.DataContext = this;
            this.TableData = new ObservableCollection<Sell_factor>();
        }
        private readonly dataclassDataContext db = new dataclassDataContext();

        private void Grid_Loaded_1(object sender, RoutedEventArgs e)
        {
            Dg_1.ItemsSource = TableData;
            Combo_sherkat.ItemsSource = db.sellers.Select(c => c.name);
        }
        
        private void Combo_sherkat_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            GetKala();
        }

        private void Combo_kala_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ChangeUnit();
        }
        public void SubmitNewBuyFactor()
        {
            Sell_factor jadid = new Sell_factor();
            jadid.seller_company = Combo_sherkat.SelectedItem.ToString();
            jadid.sell_price = int.Parse(txt_sellprice.Text);
            jadid.product_name = Combo_kala.SelectedItem.ToString();
            jadid.unit = lbl_unit.Text;
            jadid.buy_price = int.Parse(txt_buyprice.Text);
            jadid.description = txt_description.Text;
            jadid.amount = int.Parse(txt_amount.Text);
            jadid.sum_finance = ((int.Parse(txt_sellprice.Text)) - (int.Parse(txt_buyprice.Text)) - (int.Parse(txt_discount.Text))) * (int.Parse(txt_amount.Text));
            jadid.date = date_date.SelectedDate;
            jadid.discount = int.Parse(txt_discount.Text);

            db.Sell_factors.InsertOnSubmit(jadid);
            db.SubmitChanges();

            this.TableData.Add(jadid);
        }
        
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            SubmitNewBuyFactor();
            
        }
    }
}

【问题讨论】:

    标签: c# wpf visual-studio


    【解决方案1】:

    Dg_1.Items.Refresh(); 不是必需的,应该删除。
    Dg_1.ItemsSource = null; 不是必需的,应该删除。

    DataContext.SubmitChanges 显然是在产生错误,事务被回滚或者查询没有被执行(因为表/实体错误)。
    您应该检查您的实体和表格是否有错误。例如。您的表必须定义一个主键以启用使用 LINQ to SQL 的插入/更新。

    您可以使用DataContext.GetChangeSet 实际检查是否已提交更改。

    或者省略 LINQ to SQL 并使用 db.ExecuteCommand 执行纯 SQL 查询(例如,如果您不想或无法为表定义主键)。


    要修复 DataGrid 更新问题,请将 ObservableCollection 分配给 DataGrid.ItemsSource
    ObservableCollection 实现 INotifyCollectionChanged,它会在添加/删除/移动项目时自动更新每个 ItemsControl/插入:

    partial class MainWindow : Window
    {
        public ObservableCollection<Sell_factor> TableData { get; }
    
        public MainWindow()
        {
            InitializeComponent();
    
            this.DataContext = this;
     
            this.TableData = new ObservableCollection<Sell_factor>();
        }
    
        public void SubmitNewBuyFactor()
        {
            Sell_factor jadid = new Sell_factor();
            jadid.seller_company = Combo_sherkat.SelectedItem.ToString();
            jadid.sell_price = int.Parse(txt_sellprice.Text);
            jadid.product_name = Combo_kala.SelectedItem.ToString();
            jadid.unit = lbl_unit.Text;
            jadid.buy_price = int.Parse(txt_buyprice.Text);
            jadid.description = txt_description.Text;
            jadid.amount = int.Parse(txt_amount.Text);
            jadid.sum_finance = ((int.Parse(txt_sellprice.Text)) - (int.Parse(txt_buyprice.Text)) - (int.Parse(txt_discount.Text))) * (int.Parse(txt_amount.Text));
            jadid.date = date_date.SelectedDate;
            jadid.discount = int.Parse(txt_discount.Text);
    
            db.Sell_factors.InsertOnSubmit(jadid);
            db.SubmitChanges();
    
            // Update the DataGrid
            this.TableData.Add(jadid);
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            SubmitNewBuyFactor();
        }
    }
    

    MainWindow.xaml

    <Window>
      <DataGrid x:Name="Dg_1" 
                ItemsSource="{Binding TableData}" />
    </Window>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多