この空間は何のためにあるのでしょうか? ここはノードに関する情報を表示させるためにあります。今回はページ番号を表示させます。
ページ番号は以下のようになっています。
ノードを全部開いて上から順番に・・・です。
1 2 3 4 5 6 7 8 9 |
int GetPageNumber(TreeNodeEx nodeEx) { var treeNodes = syncTreeViewEx1.GetTreeNodeExs(null); int i = treeNodes.IndexOf(nodeEx); if (i != -1) return i + 1; else return -1; } |
これでもいいのですが、取得するページ数が多い場合、これだと時間がかかってしまいます。そこでノードが追加されるタイミングでsyncTreeViewEx1.GetTreeNodeExs(null)を実行して通し番号をつけるようにしてしまいましょう。こちらのほうが早いはずです。
まずページ番号を示すプロパティを追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Data { public Data() { RichData = new RichData(); } public int pageNumber{ set; get; } public RichData RichData { get; set; } } |
これをつかってページ番号をつけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class Form1 : Form { void SetPageNumbers() { var nodeExs = syncTreeViewEx1.GetTreeNodeExs(null); int count = nodeExs.Count; for (int i = 0; i < count; i++) GetData(nodeExs[i]).pageNumber = i + 1; } public void OnChangedSyncTreeView() { SetPageNumbers(); } } |
OnChangedSyncTreeViewは新しいノードを追加したり、移動、削除したときに呼ばれます。そのときにSetPageNumbersを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form1 : Form { InitializeComponent(); group = new SyncGroup(imageList1); group.SetTreeView(syncTreeViewEx1); group.SetTreeView(syncTreeViewEx2); Data data0 = new Data(); TreeNodeEx newTreeNodeEx = syncTreeViewEx1.AddNodeLastChild(null, "Root", 2, 2, data0); System.Threading.Thread.Sleep(10); Data data1 = new Data(); _trashNode = syncTreeViewEx1.AddNodeLastChild(null, "ゴミ箱", 2, 2, data1); System.Threading.Thread.Sleep(10); Data data2 = new Data(); syncTreeViewEx1.AddNodeLastChild(newTreeNodeEx, "New Node", 0, 0, data2); syncTreeViewEx1.SelectedNode = newTreeNodeEx; syncTreeViewEx2.SelectedNode = newTreeNodeEx; OnChangedSyncTreeView(); } |
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
public class SyncTreeViewEx : SyncTreeView { void OnChangeSyncTreeView() { Form1 f = (Form1)FindForm(); f.OnChangedSyncTreeView(); } new public TreeNodeEx AddNodeFirstChild(TreeNodeEx parentNode, string text, int image, int selectImage, object data) { TreeNodeEx ret = base.AddNodeFirstChild(parentNode, text, image, selectImage, data); OnChangeSyncTreeView(); return ret; } new public TreeNodeEx AddNodeLastChild(TreeNodeEx parentNode, string text, int image, int selectImage, object data) { TreeNodeEx ret = base.AddNodeLastChild(parentNode, text, image, selectImage, data); OnChangeSyncTreeView(); return ret; } new public TreeNodeEx AddNodeNext(TreeNodeEx targetNode, string text, int image, int selectImage, object data) { TreeNodeEx ret = base.AddNodeNext(targetNode, text, image, selectImage, data); OnChangeSyncTreeView(); return ret; } new public TreeNodeEx AddNodePrev(TreeNodeEx targetNode, string text, int image, int selectImage, object data) { TreeNodeEx ret = base.AddNodePrev(targetNode, text, image, selectImage, data); OnChangeSyncTreeView(); return ret; } new public void PasteFromClipboard(TreeNodeEx targetNode, InsertTo insertTo, Type[] types) { base.PasteFromClipboard(targetNode, insertTo, types); OnChangeSyncTreeView(); } protected override void OnEndItemDrag(EventArgs e) { base.OnEndItemDrag(e); Form1.ignoreSelectedNodeChange = false; OnChangeSyncTreeView(); } } |
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 35 |
public partial class Form1 : Form { void DeteleNodes(TreeNodeEx targetNode) { if (TrashNode == targetNode) TrashClear(); else DeteleNodes0(targetNode); OnChangedSyncTreeView(); } void OpenFile() { OpenFileDialog open = new OpenFileDialog(); open.Filter = "trtファイル|*.trt"; if (open.ShowDialog() == DialogResult.OK) { StreamReader sr = new StreamReader(open.FileName); XmlSerializer xml = new XmlSerializer(typeof(Doc), types.ToArray()); var doc = (Doc)xml.Deserialize(sr); sr.Close(); syncTreeViewEx1.RestoreNodes(doc.treeNodeExes, null, InsertTo.LastChild); syncTreeViewEx1.SetExpands(null, doc.treeNodeExes.Select(x => x.IsExpanded).ToList()); curFilePath = open.FileName; _trashNode = syncTreeViewEx1.GetTopLevelLastTreeNodeEx(); OnChangedSyncTreeView(); } } } |
ノードが選択されたらノードの情報が下のLabel部分に表示されます。
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
public partial class Form1 : Form { private void syncTreeViewEx1_AfterSelect(SyncTreeView sender, AfterSelectArgs e) { if (ignoreSelectedNodeChange) return; var node = syncTreeViewEx1.SelectedNode; if (node == null) return; textBox1.Text = node.Text; syncRichTextBoxEx1.Data = GetData(node).RichData; ShowNodeInfo1(node); } private void syncTreeViewEx2_AfterSelect(SyncTreeView sender, AfterSelectArgs e) { if (ignoreSelectedNodeChange) return; var node = syncTreeViewEx2.SelectedNode; if (node == null) return; textBox2.Text = node.Text; syncRichTextBoxEx2.Data = GetData(node).RichData; ShowNodeInfo2(node); } void ShowNodeInfo1(TreeNodeEx nodeEx) { var dt1 = new DateTime(GetData(nodeEx).RichData.CreateTime); var dt2 = new DateTime(GetData(nodeEx).RichData.SaveTime); label1.Text = String.Format("ページ {0} 作成日時 {1} 更新日時 {2}", GetData(nodeEx).pageNumber, dt1.ToString(), dt2.ToString()); } void ShowNodeInfo2(TreeNodeEx nodeEx) { var dt1 = new DateTime(GetData(nodeEx).RichData.CreateTime); var dt2 = new DateTime(GetData(nodeEx).RichData.SaveTime); label2.Text = String.Format("ページ {0} 作成日時 {1} 更新日時 {2}", GetData(nodeEx).pageNumber, dt1.ToString(), dt2.ToString()); } public void OnChangedSyncTreeView() { SetPageNumbers(); TreeNodeEx nodeEx1 = syncTreeViewEx1.SelectedNode; TreeNodeEx nodeEx2 = syncTreeViewEx2.SelectedNode; if(nodeEx1 != null) ShowNodeInfo1(nodeEx1); if (nodeEx2 != null) ShowNodeInfo2(nodeEx2); } } |