TreeViewのBeginUpdateの謎

■ プログラム Posted by ひぐま (Higmmer) on 2005-10-04 at 22:57:58
今日もFeedSaverのコーディングを行い、コンテキストメニューを実装してアイテムの編集と削除を行えるようにしました。と同時に、データの保存/読込を行うためにボタンを押す必要があったのを、起動時と終了時に自動ロード/セーブするように修正しました。

と、ここで謎の現象発生。フォームのLoadイベントハンドラの中でXMLファイルを読みに行き、TreeViewを構築しているのですが、データが空の場合(TreeViewも空のまま)、次に新しいアイテムを追加した時に画面に表示されないのです。表示はされないものの何故か選択は可能で、更に別のアイテムを追加すると最初のアイテムと同時に表示されます。しかも、最初にデータが1つでも読み込まれた場合はこの現象は発生しません。全く意味が分からんとです。

ロード時のコードは以下の通りです。

private void FeedSaverForm_Load(object sender, System.EventArgs e)
{
if(System.IO.File.Exists(FeedFileName))
{
FeedTreeSerializer ftsr = new FeedTreeSerializer(treeView_Feed);
ftsr.Deserialize(FeedFileName);
}
}

そしてDeserializeメソッドの中身は次のようになっています。

public void Deserialize(string filename)
{
XmlTextReader reader = null;

_tree_view.BeginUpdate();
_tree_view.Nodes.Clear();

try
{
reader = new XmlTextReader(filename);
// 以下、XMLファイルの解析処理
}
catch(SomeException ex)
{
// エラー処理省略
}
finally
{
if(reader != null) reader.Close();
_tree_view.EndUpdate();
}
}

上記のコードでBeginUpdateとEndUpdateをコメントアウトするとうまくいきました。この2つはDeserializeがボタンから呼び出されていた時の名残ですが、推測するにLoadイベントの発生中はまだフォームが表示されていないのでBeginUpdateを呼んだ時の動作は保証されないということでしょうか。そもそも起動時にはBeginUpdateがなくても表示には影響しないはずだし、必要な時は呼び出し側で対処するということで一応解決しましたが、データの有無で挙動が変わるのはちょっと納得できない気も…。ちゃんとした理由が分かる方いましたらコメントお願いします。

トラックバック

この記事について書く(FC2ブログユーザー)
※言及リンクの無いトラックバックは無効です

PageTop▲

コメント

PageTop▲

コメントの投稿

 
 
 
 
 
 (後で編集・削除したいなら必須)
 
  

PageTop▲