ツリービューを更新するには?


てりたま  2004-10-27 01:39:37  No: 54899

VC++初心者ですのでよろしくお願いいたします.
ツリービューの取扱いに関して質問させてください.

【実現したいこと】
ランダム生成されるID(数字)をツリービューに表示.
IDがランダム生成される度にツリービューを更新.

【問題となっている点】
1回目にIDが生成されるとツリービューに正しく表示
される.
しかし,2回目以降は1回目のツリービューが消去されずに
,連続して記述されてしまう.

[1回目実行]
-ID
     -12
     -84
     -35
[2回目実行]
-ID
     -12
     -84
     -35
-ID
     -98
     -33
     -41
 
そこで,DeleteItem()/DeleteAllItemsを使用してID生成の
度に,最初に全てのアイテムを消去することにしました
(ID生成はボタンを使用).
しかし,その場合,ツリービューには一切何も表示され
ません.何度,ボタンを押してIDを生成しても表示され
ません.

以下に検証のために作成したソースを記述いたします.
以下を実行すると,『表示』を押しても何もツリービュー
に現れません.OnBnClickedButton2()のDeleteAllItems()を
コメントアウトすると,『表示』を押すとIDを親とするツリー
が積み重なっていき,初期化されません.

【インクルードファイル】
static HTREEITEM plate[10];
static HTREEITEM id[100];

【ソース】
ツリービューとボタン2個を使用
ツリービューに表示するIDはfor文のループ回数です.
ボタン1はID表示用の『表示』です.
ボタン2はツリービュー初期化用の『消去』です.

// ボタン1のコントロール
void Ctrial03Dlg::OnBnClickedButton1()
{
  // 本関数の最初に以下を記述すればボタン1を押す度に初期化???
  //my_tree_view.DeleteAllItems();
  int i;
  CString id_text;
  plate[0] = my_tree_view.InsertItem("ID", TVI_ROOT);
  for(i = 0; i < 10; i++){
    id_text.Format("%d", i); 
    id[i] = my_tree_view.InsertItem((LPCTSTR)id_text, plate[0]);
  }
}
// ボタン2のコントロール
void Ctrial03Dlg::OnBnClickedButton2()
{
  // TODO : ここにコントロール通知ハンドラ コードを追加します。
  my_tree_view.DeleteAllItems();
  //my_tree_view.DeleteItem(plate_tree[0]);
}

 素人な質問で申し訳有りませんが,アドバイスお願いいたします.
Google先生で調べてみましたが,参考になるサンプルを見つけれ
ませんでした.


tpon  2004-11-23 00:36:41  No: 54900

こんにちは
私も同じ問題で悩んでました。
#でもって、Googleでこのページにたどり着いたりしたのですが・・・。

結局、原因は不明。
何故こうなるのか不思議です。

対処法ではないですが、逃げ道はありますのでご紹介します。
1.表示中のアイテムハンドルを保存しておく
2.新しいアイテムを追加する
3.1で保存しておいたアイテムを消す
これで希望通りの動作をすると思います。(私はしました)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加