表示させた検索結果をソートします。タイトルでソート、ページ番号でソート、数値が小さいものから順に並べたり、逆に大きな順に並べ替えることができます。
まず検索結果にページ番号を表示させましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class SearchResultForm : Form { public void UpdateSearchResult() { if (_treeNodeExes == null) return; listBox1.Items.Clear(); foreach (TreeNodeEx nodeEx in _treeNodeExes) { Data data = (Data)nodeEx.Data; int page = data.pageNumber; string str = String.Format("[{0}] {1}", page, nodeEx.Text);// 追加部分 listBox1.Items.Add(str); } if (_prevSelect != -1) { _isIgnoreSelectChanged = true; listBox1.SelectedIndex = _prevSelect; _isIgnoreSelectChanged = false; } } } |
ノードが追加されたり削除されたらページ番号も変更になるかもしれません。そこでノードが追加されたり削除されたときに呼ばれる自作メソッド OnChangedSyncTreeView()を以下のように書き直します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { public void OnChangedSyncTreeView() { SetPageNumbers(); TreeNodeEx nodeEx1 = syncTreeViewEx1.SelectedNode; TreeNodeEx nodeEx2 = syncTreeViewEx2.SelectedNode; if(nodeEx1 != null) ShowNodeInfo1(nodeEx1); if (nodeEx2 != null) ShowNodeInfo2(nodeEx2); // 追加された部分 var searchs = SearchResultForms; foreach (var search in searchs) { search.UpdateSearchResult(); } } } |
さてソートする要素はタイトルとページ番号です(それ以外に更新日時もあるかも)。
検索結果をソートするまえに現在選択されているListBoxに対応するノードを記憶しておきます。ソートが終わったら対応するものが選択されている状態にします。そのときにSelectedIndexChangedイベントが発生するのですが、これによって右のRichTextBoxの内容が変化しないように_isIgnoreSelectChangedをつかって対処します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class SearchResultForm : Form { private void OrderByPageNumToolStripMenuItem_Click(object sender, EventArgs e) { TreeNodeEx curNodeEx = GetSelectedNode(); _treeNodeExes = _treeNodeExes.OrderBy(x => ((Data)x.Data).pageNumber).ToList(); RestoreListBox(curNodeEx); } private void OrderByDescendingPageNumToolStripMenuItem_Click(object sender, EventArgs e) { TreeNodeEx curNodeEx = GetSelectedNode(); _treeNodeExes = _treeNodeExes.OrderByDescending(x => ((Data)x.Data).pageNumber).ToList(); RestoreListBox(curNodeEx); } private void OrderByNodeLabelToolStripMenuItem_Click(object sender, EventArgs e) { TreeNodeEx curNodeEx = GetSelectedNode(); _treeNodeExes = _treeNodeExes.OrderBy(x => x.Text).ToList(); RestoreListBox(curNodeEx); } private void OrderByDescendingNodeLabelToolStripMenuItem_Click(object sender, EventArgs e) { TreeNodeEx curNodeEx = GetSelectedNode(); _treeNodeExes = _treeNodeExes.OrderByDescending(x => x.Text).ToList(); RestoreListBox(curNodeEx); } } |