イベントをリッスンするという概念については、正しい方向に進んでいます (これは、標準的なパブリッシャー/サブスクライバーのパターンです)。
ツリービューを実際に更新するには、 と の 2 つの方法を使用する傾向がAddOrUpdateTreeItem
ありRemoveTreeItem
ます。add または update メソッドは、それが言うことを実行し、(パスに基づいて) ツリー項目を探し、それを更新または追加します。もちろん、フォームが作成されたスレッド以外のスレッドでモデルが更新されている場合は、 を使用して呼び出しをマーシャリングする必要がありますControl.BeginInvoke()
。
form_load などで完全なツリーを生成する場合、このアプローチは少し遅くなる可能性があるため、最初の生成には別の方法を使用し、ここで説明した概念を後続の更新に使用することができます。
リストビューについても同じことを行います。これが典型的な例です。ツリー項目を追加するときの主な違いは、要求されたノードを追加するために親ノードを追加する必要がある場合があることです。これにより、少し再帰的になります。試してみる。
private void AddOrUpdateListItem(DomainModelObject item)
{
ListViewItem li = lvwListView.Items[GetKey(item)];
if (li == null)
{
li = new ListViewItem
{
Name = GetKey(item),
Tag = item
};
li.SubItems.Add(new ListViewItem.ListViewSubItem());
li.SubItems.Add(new ListViewItem.ListViewSubItem());
li.SubItems.Add(new ListViewItem.ListViewSubItem());
li.ImageIndex = 0;
lvwListView.Items.Add(li);
}
li.Text = [Itemtext];
li.SubItems[1].Text = [Itemtext];
li.SubItems[2].Text = [Itemtext];
li.SubItems[3].Text = [Itemtext];
}
実装方法の例を次に示しBeginInvoke()
ます。
public class MyForm : Form
{
...
void data_Changed(object sender, DataChangedEventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new EventHandler<DataChangedEventArgs>(data_Changed), sender, e);
return;
}
AddOrUpdateListItem(e.DataItem);
}
...
}