private void initModel()
 {
     mFibTableOriginal      = new FibTable();
     mFibTableNormalized    = new FibTable();
     mFibTableCompressed    = new FibTable();
     mFibTreeOriginal       = new FibTree();
     mFibTreeNormalized     = new FibTree();
     mFibTreeCompressed     = new FibTree();
     mMultiLookupCollection = new MultiLookupCollection();
     mFibTableOriginal.CollectionChanged += MFibTableOriginal_CollectionChanged;
     mFibTreeOriginal.TreeChanged        += MFibTreeOriginal_TreeChanged;
     mFibTreeNormalized.TreeChanged      += MFibTreeNormalized_TreeChanged;
     mFibTreeCompressed.TreeChanged      += MFibTreeCompressed_TreeChanged;
 }
        private void initFibTable(ref DataGridView originalTable, ref CustomDataGridView <FibEntry> customMember, Panel container, bool canDelete, FibTable fibTable)
        {
            customMember = CreateTable <FibEntry>(ref originalTable, container);

            CustomDataGridViewColumnDescriptorBuilder <FibEntry> builder;

            // Column: prefix, IP format
            builder = new CustomDataGridViewColumnDescriptorBuilder <FibEntry>(customMember);
            builder.Type(DataGridViewColumnType.TextBox);
            builder.Header("Prefix");
            builder.Width(120);
            builder.UpdaterMethod((entry, cell) => { cell.Value = entry.IpForm; });
            builder.AddChangeEvent(nameof(FibEntry.IpForm));
            builder.BuildAndAdd();

            // Column: prefix, IP format
            builder = new CustomDataGridViewColumnDescriptorBuilder <FibEntry>(customMember);
            builder.Type(DataGridViewColumnType.TextBox);
            builder.Header("Binary");
            builder.Width(120);
            builder.UpdaterMethod((entry, cell) => { cell.Value = string.IsNullOrEmpty(entry.BinaryForm) ? "-" : entry.BinaryForm; });
            builder.AddChangeEvent(nameof(FibEntry.BinaryForm));
            builder.BuildAndAdd();

            // Column: next hop
            builder = new CustomDataGridViewColumnDescriptorBuilder <FibEntry>(customMember);
            builder.Type(DataGridViewColumnType.TextBox);
            builder.Header("Next hop");
            builder.Width(100);
            builder.UpdaterMethod((entry, cell) => { cell.Value = entry.NextHop; });
            builder.AddChangeEvent(nameof(FibEntry.NextHop));
            builder.BuildAndAdd();

            if (canDelete)
            {
                // Column: delete button
                builder = new CustomDataGridViewColumnDescriptorBuilder <FibEntry>(customMember);
                builder.Type(DataGridViewColumnType.Button);
                builder.Header("Delete");
                builder.Width(70);
                builder.ButtonText("Delete");
                builder.CellContentClickHandlerMethod((entry, cell, e) =>
                {
                    string msgBoxText = string.Format("Do you really want to delete this prefix?\n{0}", entry.IpForm);
                    var confirm       = MessageBox.Show(msgBoxText, "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (confirm == DialogResult.Yes)
                    {
                        fibTable.RemoveEntry(entry);
                    }
                });
                builder.BuildAndAdd();
            }

            // Bind database
            customMember.BoundCollection = fibTable;
        }