private TreeNode create_tree_node( TreeNode treeNode, UInt32 current_blood_num, BloodLineTree.BloodNode tree, int level )
    {
        var wp = this.wp_;
        var blood_data = new HBloodData();
        var bloodNode = tree;

        while( true ) {
            wp.HBloodTable.GetData( bloodNode.blood_num, ref blood_data );
            var newNode = new TreeNode(){
                Text = get_name_by_data( ref blood_data ),
                Tag = bloodNode.blood_num,
                ForeColor = current_blood_num == bloodNode.blood_num ? Color.Red : Color.Black,
            };

            if( bloodNode.childNode == null ) {
                treeNode.Nodes.Add( newNode );
            } else {
                treeNode.Nodes.Add( create_tree_node( newNode, current_blood_num, bloodNode.childNode, level+1 ) );
            }
            if( bloodNode.nextBrother == null ) {
                break;
            }
            bloodNode = bloodNode.nextBrother;
        }
        return treeNode;
    }
    private string create_tree_text( UInt32 current_blood_num, BloodLineTree.BloodNode tree, int level )
    {
        var wp = this.wp_;
        var blood_data = new HBloodData();
        var node = tree;

        using( var sw = new System.IO.StringWriter() ) {
            while( true ) {
                wp.HBloodTable.GetData( node.blood_num, ref blood_data );
                var mark = current_blood_num == node.blood_num ? "※" : "";
                sw.Write( String.Format("{0}|- {1}{2}\r\n", indent(level), mark, get_name_by_data( ref blood_data )  ) );

                if( node.childNode != null ) {
                    sw.Write( create_tree_text( current_blood_num, node.childNode, level+1 ) );
                }

                if( node.nextBrother == null ) {
                    break;
                }
                node = node.nextBrother;
            }
            return sw.ToString();
        }
    }
    private void DispBloodLine( UInt32 blood_num )
    {
        var wp = this.wp_;
        var blood_data = new HBloodData();

        wp.HBloodTable.GetData( blood_num, ref blood_data );

        var current_blood_num = blood_num;
        var target_blood_num = current_blood_num;

        while( true ) {
            wp.HBloodTable.GetData( target_blood_num, ref blood_data );
            if( blood_data.mother_num == wp.Config.NullBloodNumber ) {
                break;
            }
            target_blood_num = blood_data.mother_num;
        }
        var tree = new BloodLineTree( wp, BloodLineTree.BloodLineType.MARE, target_blood_num );

        var parentNode = new TreeNode(){
            Text = String.Format("{0}", get_name_by_data( ref blood_data ) ),
            Tag = tree.Tree.blood_num,
        };

        if( tree.Tree.childNode == null ) {
            this.treeView.Nodes.Add( parentNode );
        } else {
            this.treeView.Nodes.Add( create_tree_node( parentNode, current_blood_num, tree.Tree.childNode, 0 ) );
        }
        this.treeView.ExpandAll();

        this.linkLabel.Click += ( obj, ev )=> {
            if( tree.Tree.childNode == null ) {
                Clipboard.SetText( String.Format( "{0}", get_name_by_data( ref blood_data ) ) );
            } else {
                Clipboard.SetText( String.Format( "{0}\r\n{1}",
                    get_name_by_data( ref blood_data ),
                    create_tree_text( target_blood_num, tree.Tree.childNode, 0 ) )
                );
            }
            MessageBox.Show( "クリップボードにコピーしました", "完了", MessageBoxButtons.OK, MessageBoxIcon.Information );
        };
    }