在按键向下WPF上向DataGrid添加项目,性能不佳?

时间:2017-03-02 21:03:12

标签: c# wpf performance datagrid

我的应用程序是这样的:我在内部有产品的sql数据库,在主Window.xaml上有DataGridTextBox

应用程序非常简单(在下面解释):

用户应在TextBox中输入产品代码并按Enter键查找产品,如果数据库中存在包含该代码的产品,则会将其添加到DataGrid!之后,用户可以决定是否要从datagrid中删除一些项目,或者将它们全部打印出来等。

这是它的外观,我在油漆中做了一点点绘画:)

enter image description here

我的问题从这里开始:

当我将数据库中的项目添加到我的DataGrid时,它的工作速度有点慢,我的意思是它不应该很快,当项目被提供时,真的可以感觉到有一点延迟DataGrid

我以为我做了应有的一切,但可能我没有做过,而且我觉得性能一定有问题,或者我的代码不好!

现在我会发布我的代码,所以如果你们可以给我建议如何加快速度或者建议我可以做得更好,请这样做,我真的应该这样做,因为我不知道我做错了, 也许我没有将数据绑定到DataGrid,因为它应该或其他什么,但我不希望我的应用程序变慢,特别是因为它非常简单的应用程序..

这是我的代码:

//I need to add new item from database to my DataGrid when user press Enter 
private void txtCode_KeyDown(object sender, KeyEventArgs e)
        {

            if (e.Key == Key.Return)
            {
        //Here I am making sure that I will not look for empty string in my database
                if (!String.IsNullOrEmpty(txtCode.Text.Trim()))
                {
            //Here I am looking for product in my database with code that user entered 
                    Article product = ArticlesController.GetProductByProductCode(txtCode.Text.Trim());

                    if (product!= null)
                    {
                        ProductTemporary tempProduct= new ProductTemporary();

                        tempProduct.ArticleCode = product.ArticleCode;
                        tempProduct.Price = product.Price;
                        tempProduct.Quantity = 1;
                        tempProduct.ArticleId = product.Id;
                        tempProduct.ArticleTitle = product.Title;
                        tempProduct.TotalAmount = (tempProduct.Quantity * tempProduct.Price);

            //Here I'm adding item from database to Temp Table in case computer turns off, so when user log in back he can still find items he searched for before
                        var lastInserted = ProductsTempController.InsertNewTempProduct(tempProduct);

                        currentlyDataGridItems.Add(lastInserted);

                        dtgProductItems.ItemsSource = null;
                        dtgProductItems.ItemsSource = currentlyDataGridItems;

                        txtCode.Text = "";
                        txtCode.Focus();

                    }
                    else
                    {
                        MessageBox.Show("Product with next code:" + txtCode.Text + " does not exist.", "Search by product code", MessageBoxButton.OK, MessageBoxImage.Information);
                        txtCode.Text = "";
                        txtCode.Focus();
                    }
                }
            }
        }

所以我想知道这段代码有什么问题,为什么我在向DataGrid添加项目时必须感到延迟,我认为在数据库中搜索产品需要时间,但是我只删除了除了5个产品以外的所有产品它应该工作得非常快,实际上这是非常简单的行动:

在数据库中查找项目,将其插入临时表,将其添加到数据网格

但不知怎的,它没有像预期的那样快速起作用, 无论如何,感谢很多人和欢呼!

1 个答案:

答案 0 :(得分:2)

首先,即使在完美的实现中,数据网格也是一个沉重而缓慢的控制,因为它有许多事情要做,但是,你的问题是不断删除并再次添加所有元素,这会导致渲染从一开始就发生。

您应该使用WPF ObservableCollection<T>来保存您的列表。可观察集合具有此属性,当您向其添加或删除元素时,所有绑定将自动得到通知并且UI会更新(仅包含需要更新的内容)。

在更好的方法中,我只在预定义的时间间隔内向UI集合中添加项目,如果用户连续10次按下按钮,您的UI只会使用所有新信息更新一次。

要做到这一点,首先要定义一个列表:

var result = new ObservableCollection<ProductTemporary>();

然后将列表设置为网格项目的来源

dtgProductItems.ItemsSource = result;

最后,当您想要更改它时,只需更改result

即可
result.Add(lastInserted);

最后提示是在另一个线程中执行非UI作业以保持UI响应。

希望有所帮助:)