0

フォームに Datagrid と Text Box があります。Datagrid は在庫にある既存のアイテムを表示しています。テキスト ボックスを使用して検索し、テキスト ボックスと一致する行にフォーカスを設定します。現在、VirtualizingStackPanel.IsVirtualizing="false" の場合は正常に動作していますが、非常に遅く、多くの RAM リソースを取得しています。これが私のコードです。

public IEnumerable<Microsoft.Windows.Controls.DataGridRow> GetDataGridRows(Microsoft.Windows.Controls.DataGrid grid)
        {
            var itemsSource = grid.ItemsSource as IEnumerable;
            if (null == itemsSource) yield return null;
            foreach (var item in itemsSource)
            {
                var row = grid.ItemContainerGenerator.ContainerFromItem(item) as Microsoft.Windows.Controls.DataGridRow;
                if (null != row) yield return row;
            }
        }


        private void SearchBoxDataGrid_TextChanged(object sender, TextChangedEventArgs e)
        {
            var row = GetDataGridRows(AssortDataGrid);
            /// go through each row in the datagrid
            foreach (Microsoft.Windows.Controls.DataGridRow r in row)
            {
                DataRowView rv = (DataRowView)r.Item;
                // Get the state of what's in column 1 of the current row (in my case a string)
                string t = rv.Row["Ассортимент"].ToString().ToLower();
                if (t.StartsWith(SearchBoxDataGrid.Text.ToLower()))
                {
                    AssortDataGrid.SelectedIndex = r.GetIndex();
                    AssortDataGrid.ScrollIntoView(AssortDataGrid.SelectedItem);
                    break;
                }

            }
        }

私が望むのは VirtualizingStackPanel.IsVirtualizing="true" にすることですが、この場合、私の方法は機能しません。それが機能しない理由はわかっています。私のコードは Datagrid の一部を表示するためだけに機能します。おすすめは何ですか?この問題を解決するにはどうすればよいですか? どんなアイデアでも大歓迎です。動作するコードを提供すると、それは素晴らしいものになります。私の問題を説明できれば幸いです。

4

2 に答える 2

0

私は少しコーディングをして、それを機能させました。将来誰かがそれを必要とするならば、それを使ってください。まず、商品リストを作成しています

List<string> ProductList;

次に、Load Methodで、すべての製品を製品リストにリストします。

    SqlCommand commProc2 = new SqlCommand("SELECT dbo.fGetProductNameFromId(ProductID) as ProductName from Assortment order by ProductName desc", MainWindow.conn);
    string str2;
    SqlDataReader dr2 = commProc2.ExecuteReader();
    ProductList = new List<string>();
    try
    {
        if (dr2.HasRows)
        {
            while (dr2.Read())
            {
                str2 = (string)dr2["ProductName"];
                ProductList.Insert(0, str2.ToLower ());
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("An error occured while trying to fetch data\n" + ex.Message);
    }

    dr2.Close();
    dr2.Dispose(); 

その後、SearchBoxDataGrid_TextChangedでいくつかの変更を行いました

    private void SearchBoxDataGrid_TextChanged(object sender, TextChangedEventArgs e)
    {

        int pos = 0;
        string typedString = SearchBoxDataGrid.Text.ToLower();
        foreach (string item in ProductList)
        {
            if (!string.IsNullOrEmpty(SearchBoxDataGrid.Text))
            {
                if (item.StartsWith(typedString))
                {
                    pos = ProductList.IndexOf(item);
                    AssortDataGrid.SelectedIndex = pos;
                    AssortDataGrid.ScrollIntoView(AssortDataGrid.SelectedItem);
                    break;
                }
            }
        }

    }

VirtualizingStackPanel.IsVirtualizing="true"のときに機能するようになりました。以上です。

于 2012-09-05T12:14:01.513 に答える
0

仮想化とは、WPF が UI コンポーネントを再利用し、単にDataContextコンポーネントの背後にあるものを置き換えることを意味します。

たとえば、グリッドに 1000 個のアイテムがあり、10 個しか表示されていない場合、約 14 個の UI アイテム (スクロール バッファー用の余分なアイテム) のみがレンダリングされ、スクロールは、DataContextすべてのアイテムに対して新しい UI 要素を作成するのではなく、これらの UI アイテムの背後にあるものを単純に置き換えます。を使用しなかった場合Virtualization、1000 個の UI 項目すべてが作成されます。

仮想化を使用するには、UI コンポーネントではなく( )Searchをループする必要があります。これはコード ビハインドで行うか、MVVM を使用している場合は.DataContextDataGrid.ItemsSeachCommandViewModel

于 2012-08-27T12:47:20.143 に答える