質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

2回答

3495閲覧

C# WPF TabControlの切り替え高速化

riko0109

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/07/21 09:59

編集2020/07/23 06:44

C# WPF においてTabControl上にDataGridを配置したCSVビューアーを作成しました。

GにはDataTableをバインドしています。

このTabControlのデータ量が大きい場合にタブを切替え、当該タブを再選択すると表示までにラグがあります。
TabControlがアクティブでなくなったときに情報を保持していないようなのですが、
タブ切替後も情報を保持し無駄な描画をなくす方法、または表示部分以外の読込を遅延させ、スクロール時に読み込む方法はありますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2020/07/21 20:28

実験してみたんですが10列10万行のデータでは起動はそれなりに遅かったですが、タブ切り替えは特に遅いとは感じませんでした(ListView DataGridどちらでも) 列を増やすのはListViewだと面倒なのでやってませんが、列が多い感じでしょうか? 再現するコードがあればよいのですが。。 あとはこの辺を試していただくのも手でしょうか。 [wpf - How to preserve control state within tab items in a TabControl - Stack Overflow](https://stackoverflow.com/questions/2080764/how-to-preserve-control-state-within-tab-items-in-a-tabcontrol
riko0109

2020/07/22 10:15

ありがとうございます。 こちらのテストデータは88列888行でした。データ量としてはそこまででもないので私の環境が貧弱なのかもしれません。 いただいたページも参考にさせて戴きます。
TN8001

2020/07/22 10:38

88列だと2秒ほど待つ感じになりました^^; 列方向のほうが影響が大きいみたいですね。 EnableColumnVirtualization="True" を付けると多少ましになりますが、引っかかる感じは残りました。 ColumnWidth="100" 等固定値を入れると気持ち効いている気がします(気のせいかもしれません^^;
riko0109

2020/07/22 13:54

おっしゃる通り列方向の影響が大きいですね。 どこかの質問サイトでtabcontrolのitemssourceにコレクションをバインドするのとtabitemに単一のオブジェクトをバインドするのでも違いが出るようでした。前者だとタブが再選択されるたびに読込されるとか書いてありました。ただtabitemへのバインドを動的にやるのも大変な気がします。
TN8001

2020/07/23 08:14

まずは、 <DataGrid AutoGenerateColumns="True" ColumnWidth="80" EnableColumnVirtualization="True" ItemsSource="{Binding Contents}" /> を試してみてください。 提示したソリューションも試してみましたが、88*888程度だと↑とあまり変わりませんでした。
riko0109

2020/07/24 03:07

ありがとうございます。 仮想化関係の設定を一通りTrueにしてみました。それなりにスピードは上がったかなと思います。 それにテストデータの88列はあまり扱わない列の量ですのでそこまで厳しく見なくても良いかなと思いました。。 初心者にお付き合いいただきありがとうございました。
guest

回答2

0

または表示部分以外の読込を遅延させ、スクロール時に読み込む方法はありますか?

GridViewではなく、ListViewのDetailsモードではどうでしょう。
VirtualModeがありますんで、お望みのことができます

投稿2020/07/21 10:41

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

riko0109

2020/07/21 11:49

ありがとうございます。 ListViewでの実装も考えてみます。
TN8001

2020/07/21 20:28

WPFでGridViewというとこれです。 [GridView クラス (System.Windows.Controls) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.gridview ListViewを表形式で表示するビューです。 y_waiwaiさんはおそらくこれと勘違いしています。 [DataGridView クラス (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.datagridview WPFで↑と同等のコントロールはこれです。 [DataGrid クラス (System.Windows.Controls) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.datagrid ListView+GridViewか、DataGridどちらかでやってると思うのですが、結局どっちなんでしょう? WPFではListViewもDataGridも規定で仮想化が有効です(が、結構ややこしいです)
riko0109

2020/07/22 10:11

ありがとうございます。 私はDatagridを使用しておりました。
guest

0

DataTableの読み込みを GridView の Loadedイベント とかでやっていませんか?
Loadedイベントはタブの切り替えのたびに発生しますよ。

それが原因なら、GridView の Initializedイベント に切り替えると直るかと思います。

投稿2020/07/22 00:08

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

riko0109

2020/07/22 10:30

DataTableはTabControl内のDataGridのItemsSourceにバインドしております。読み込みのタイミングをこちらから明示的に制御できるのでしょうか
退会済みユーザー

退会済みユーザー

2020/07/22 12:09

ではなくて、既定のイベントが、 タブの初回切り替え時:Initialized → Loaded なのに対して、 2回目以降の切り替え時:Loadedのみ ということです。 なので、LoadedでDataTableを読み込むと、タブを選択するたびに、 毎回、DataTableを読み込むことになって重いですよ。 というお話です(^^)
Zuishin

2020/07/22 12:12

「WPF でバインド」と言えば普通はイベントで読み込んだりしないんですが、質問にコードが書いてないからこういう回答もつきますね。
退会済みユーザー

退会済みユーザー

2020/07/22 13:02

何か勘違いしていないかと。 DBだか、XMLだか、大元のデータがどこにあるかは知りませんが、 大元のデータをDataTableに読み込む話ですよ。 ItemsSourceからGUIに読み込む話じゃないです。
Zuishin

2020/07/22 13:08

DataTable 「を」読み込むのか DataTable 「に」読み込むのかで意味が変わります。
Zuishin

2020/07/22 13:21 編集

それに、どちらにしても View のイベントで読み込むのではなく ViewModel 作成時やコマンドを使うのが普通です。でなければバインドした意味が半減します。
riko0109

2020/07/22 13:59

バインドソースのDataTableはviewのデータコンテキストにviewmodelを指定して生成してます。 タブ切替時にviewがDataTableを再読み込みに行ってる様な挙動でしたのでそれを制御出来る方法があればと言う意図での質問でした。
退会済みユーザー

退会済みユーザー

2020/07/22 23:28

ほぼ間違いなくそうだと思います。 一度、デバッガで追ってみてください。 タブを選択するたびに再読み込みしてる確率が非常に高いです。 なので、イベントを選べば、再選択時は走らないイベントもあるよという話です。 イベントで読み込みたくないのはMVVMにこだわってるのかな? 私はあまりこだわらない派ですが、こだわるならこだわるでやり方はあります。 というか、重箱の隅を突っつくより、答えを書きましょうよ。 イベントで読み込みたくないなら、TabControlを含むxaml側のViewModelで DataTableを読み込みましょう。 そのうえで、読み込み済みのDatTableをGridViewに渡せばいいだけです。
Zuishin

2020/07/22 23:44 編集

イベントで読み込んでいないならイベントの話は的外れなので重箱の隅ではありません。この回答の根源的な問題です。 だけど本当に言いたかったのは次です。 > 質問にコードが書いてないからこういう回答もつきますね。 答えを書けということですが、この質問には不備が多すぎますし、後で判明したクラス名の間違いや重大な情報を質問に反映することもしていません。元々 88 列というのも無理があります。私なら、列を減らせないなら DataGrid や TabControl を使わないという方向で解決すると思いますが、それを伝えるのは面倒なのでしません。
Zuishin

2020/07/22 23:40 編集

質問者からのコメントにより間違った回答だということが確定し、またそれを回答者が理解していないことがわかったので低評価します。
退会済みユーザー

退会済みユーザー

2020/07/23 22:49

なんじゃ、ここ。 質問者以外が低評価とか。機能からしてあほすぎる。 まぁ、偉そうなZuishiさんには高評価つけてやるよ。 ちょっと、ここの機能はひどすぎるので退会させてもらうわ。 ほなら、せいぜい頑張ってなZuishinさん。 さよなら、おしりペンペン(@^^)/~~~
退会済みユーザー

退会済みユーザー

2020/07/23 23:01

評価の仕方分からんから、フォローしといてやったわ(笑) あんたが、これ読むころは退会済みの予定や。 んじゃ(@^^)/~~~
Zuishin

2020/07/23 23:18

低評価とコメントはアホな回答を質問者や後から見る人が真に受けないようにするために必要な機能ですよ。重箱の隅とか言い訳している間に直せばよかっただけです。回答を修正すれば低評価は外れて高評価になることもあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問