• 开发工具:Vs2012 语言c# winform 源码可以调试,运行。在DataGridView中显示结构
  • 只要下个System.Windows.Forms.TreeListView.dll 引用下就可以了   这个控件非常的好用,令我实现了效果... 现在向需要的朋友推荐推荐这个控件

          只要下个System.Windows.Forms.TreeListView.dll 引用下就可以了  

          这个控件非常的好用,令我实现了效果...  现在向需要的朋友推荐推荐这个控件

         

       

    展开全文
  • ![图片说明](https://img-ask.csdn.net/upload/201807/12/1531375980_853491.png) 如上图所示,读取XML文件中某个节点下的内容,累计叠加显示到datagridview,这一块代码怎么写?? ![图片说明]...
  • 在WinForm开发中,DataGrid/DataGridView被广泛使用于绑定数据库中数据进行呈现.整理一些关于DataGrid/DataGridView使用的文章,涉及DataGrid/DataGridView基本功能,自定义绘制控件,数据导入/导出(Excel),打印等. ...

        在WinForm开发中,DataGrid/DataGridView被广泛使用于绑定数据库中数据进行呈现.整理一些关于DataGrid/DataGridView使用的文章,涉及DataGrid/DataGridView基本功能,自定义绘制控件,数据导入/导出(Excel),打印等.

    1.新数据网格简介(DataGridView)

    2.自定义DataGridView外观

    3.怎样让WinForms下DataGrid可以像ASP.NET下的DataGrid一样使用自定义的模板列

    DataGrid

    4.在Winform的DataGridView的单元格中同时显示文本和图标,以及树形结构的示例

    TreeViewGrid

    5.推荐一款DataGridView的打印解决方案

    6.一个关于DataGrid的打印类,分享,感谢作者

    7.继续发布VS2005下DataGridView 的多种样式列控件

    DataGridView

    8.Windows Forms DataGridView 中合并单元格

    9.财务显示单元格的GridView控件(源码可以下载) 

    10.DataGridView数据窗口控件开发方法及其源码提供下载

    11.如何在WinForm中对DataGrid进行分页显示

    12.winform 中的 datagridview 添加 progressbar列 和 calendar 列

    13.开源了!!!绘制出的dataGridView(二维表头、数据分组归类、表低合计、选中改变状态、打印) 

    14.DataGridView实现添加合计行并始终显示在底部

    15.DataGridView合并表头实现 、二维表头的实现

    16.

    17.

    18.

    19.

    20.


    本文转自peterzb博客园博客,原文链接:http://www.cnblogs.com/peterzb/archive/2009/05/29/1491629.html,如需转载请自行联系原作者。

    展开全文
  • C# — WinForm DataGridView篇 最近用C#的winform开发了一个项目,从中积累了一些各个控件的使用方法,特将部分方法共享。 这一篇的主角是DataGridView: 属性组如下: 1、背景颜色设置 2、是否一次性支持选择多...
    C# — WinForm DataGridView篇
    

    最近用C#的winform开发了一个项目,从中积累了一些各个控件的使用方法,特将部分方法共享。

    这一篇的主角是DataGridView:

    属性组如下:

    1、背景颜色设置

    2、是否一次性支持选择多条记录

    3、选择模式,一点击就是选择一行

    4、绑定数据源后的隐藏列属性

    View Code
    this.dataGridView.Columns["emp_photo"].Visible = false;

    5、绑定数据源后的冻结列属性,使用户在使用横向条查看数据时,也能时刻看到是谁的数据,提高用户体验

    冻结了第一列的数据

    View Code
    this.dataGridView.Columns[0].Frozen = true;

    方法组如下:

    1、DataGridView控件的标题列设置序号,同时设置默认宽度

    View Code
    复制代码
    private void dView_employee_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
            {
                dView_employee.RowHeadersWidth = 60;
                for (int i = 0; i < dView_employee.Rows.Count; i++)
                {
                    int j = i + 1;
                    dView_employee.Rows[i].HeaderCell.Value = j.ToString();
                }
            }
    复制代码

    效果如图1所示:

    2、datagirdview的行双击事件

    View Code
    private void dView_employee_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                /*判断点击行标题与列标题*/
                if (e.RowIndex > -1 && e.ColumnIndex > -1)
                {
                    /*传员工工号过去*/
                    emp_id = dView_employee.CurrentRow.Cells[0].Value.ToString();
                    Employee_file file = new Employee_fil();                    
                    file.Show()
                    //this.Hide();
                }
            }

    三种点击方法的比较:

    三种方法,我个人都用过,最后还是由衷地觉得CellDoubleClick方法是比较符合我现在的这个需求的:

    CellClick方法是当用户一点击,就执行事件,有时用户不经意的点击都会触发执行事件;

    CellContentClick方法是当用户点击DataGirdView单元格中的内容时,才会触发该事件,用户在使用时,有时他不能准确地点击到单元格内容,导致执行效果老是出不来;

    CellDoubleClick方法是当用户双击某一行的数据时,执行事件,配合选择模式(SelectionMode)属性,效果不错。

    3、DataGirdView中的数据转化为DataTable

    View Code
    public DataTable GetDgvToTable(DataGridView dgv)
            {
                DataTable dt = new DataTable();
                for (int count = 0; count < dgv.Columns.Count; count++)
                {
                    DataColumn dc = new DataColumn(dgv.Columns[count].Name);
                    dt.Columns.Add(dc);
                }
                for (int count = 0; count < dgv.Rows.Count; count++)
                {
                    DataRow dr = dt.NewRow();
                    for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
                    {
                        dr[countsub] = Convert.ToString(dgv.Rows[count].Cells[countsub].Value);
                    }
                    dt.Rows.Add(dr);
                }
                return dt;
            }

    4、DataGirdView中的数据导出到Excel,其中调用了上次转化成DataTable的方法,用的是网上导出到Execl的方法,但同时增加了对数字与时间字段的判断

    View Code
    public void ExportTOExcel(DataGridView dView)
            {
                /*用的三层结构,调用了一个类*/
                using (BLLConnect a = new BLLConnect())
                {
                    DataTable myDt = GetDgvToTable(dView);
                    SaveFileDialog saveFileDialog = new SaveFileDialog();
                    if (myDt.Rows.Count == 0)
                    {
                        MessageBox.Show("没有数据可供导出!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    else
                    {
                        saveFileDialog.Filter = "Execl文件|*.xls";
                        saveFileDialog.FilterIndex = 0;
                        saveFileDialog.RestoreDirectory = true;
                        saveFileDialog.Title = "导出文件保存路径";
                        saveFileDialog.FileName = null;
                        saveFileDialog.ShowDialog();
                        string FileName = saveFileDialog.FileName;
    
                        if (FileName.Length != 0)
                        {
                            DataTable dt = myDt;
                            FileStream objFileStream;
                            StreamWriter objStreamWriter;
                            string strLine = "";
                            objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
                            objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);
    
                            for (int i = 0; i < dt.Columns.Count; i++)
                            {
                                strLine = strLine + dt.Columns[i].ColumnName.ToString() + Convert.ToChar(9);
                            }
                            objStreamWriter.WriteLine(strLine);
                            strLine = "";
    
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                for (int j = 0; j < dt.Columns.Count; j++)
                                {
                                    if (j == 0 || j == 7 || j == 15 || j == 17) /*数字*/
                                    {
                                        strLine = strLine + "@" + Convert.ToString(dt.Rows[i][j]) + Convert.ToChar(9);
                                    }
                                    else if (j == 10 || j == 13) /*时间*/
                                    {
                                        strLine = strLine + string.Format("{0:d}", Convert.ToDateTime(dt.Rows[i][j])) + Convert.ToChar(9);
                                    }
                                    else
                                    {
                                        strLine = strLine + Convert.ToString(dt.Rows[i][j]) + Convert.ToChar(9);
                                    }
                                }
                                objStreamWriter.WriteLine(strLine);
                                strLine = "";
                            }
                            objStreamWriter.Close();
                            objFileStream.Close();
                            MessageBox.Show("数据导出成功","提示");
                        }
                    }
                }
            }

    展开全文
  • 结构类似于这样: 其中id为主键,pre为父级ID,这样的表结构可以生成TreeView.如下图 现在要将这两个控件组合起来使用,可以根据TreeView的节点展开和收缩在DataGridView中显示不同的行。 TreeView全部展开...

    有时候会遇到将TreeView和DataGridView控件组合起来使用的需求。

    表结构类似于这样:

     其中id为主键,pre为父级ID,这样的表结构可以生成TreeView.如下图

    现在要将这两个控件组合起来使用,可以根据TreeView的节点展开和收缩在DataGridView中显示不同的行。

    TreeView全部展开后如下图:

    TreeView部分收缩后见下图:

    以下是部分代码:具体示例大家可以到我的网站去下载,下载示例

    现在的问题是无法实现排序功能,希望高手给与指点。

      1  public partial class Form1 : Form
    2 {
    3 public Form1()
    4 {
    5 InitializeComponent();
    6 }
    7 /// <summary>
    8 /// 存放数据源
    9 /// </summary>
    10 DataTable dt = new DataTable();
    11 private void Form1_Load(object sender, EventArgs e)
    12 {
    13 #region 数据源示例
    14 dt.Columns.Add("id");
    15 dt.Columns.Add("value");
    16 dt.Columns.Add("dis");
    17 dt.Columns.Add("pre");
    18 dt.Rows.Add(0, "00", "000", 0);
    19 dt.Rows.Add(1, "11", "111", 0);
    20 dt.Rows.Add(2,"22","222",1);
    21 dt.Rows.Add("a", "a3", "a000", "a");
    22 dt.Rows.Add("b", "b2", "b111", "a");
    23 dt.Rows.Add("c", "c1", "c222", "a");
    24 #endregion
    25 creatTree(dt, treeView1);
    26 creatDataGridView(dt, dataGridView1);
    27 dataGridView1.RowHeadersVisible = false;
    28 treeView1.ItemHeight = dataGridView1.ColumnHeadersHeight+2;
    29 treeView1.Indent = 5;
    30 tableChange();
    31 }
    32 /// <summary>
    33 /// 填充DataGridView
    34 /// </summary>
    35 /// <param name="dt"></param>
    36 /// <param name="dgv"></param>
    37 void creatDataGridView(DataTable dt,DataGridView dgv)
    38 {
    39 dgv.DataSource=dt.DefaultView;
    40 //可以做一些其他事情。
    41
    42 }
    43 /// <summary>
    44 /// 用DataTable填充树
    45 /// </summary>
    46 /// <param name="dt"></param>
    47 /// <param name="tv"></param>
    48 void creatTree(DataTable dt,TreeView tv)
    49 {
    50 if (dt.Rows.Count == 0) return;
    51
    52
    53 foreach (DataRow dr in dt.Rows)
    54 {
    55
    56 if (dr["id"].ToString() == dr["pre"].ToString())
    57 {
    58
    59 tv.Nodes.Add(dr["id"].ToString(), dr["id"].ToString());
    60
    61 }
    62 else
    63 {
    64 TreeNode[] t=tv.Nodes.Find(dr["pre"].ToString(),true);
    65
    66 if (t.Length < 1)
    67 return;
    68 else
    69 t[0].Nodes.Add(dr["id"].ToString(), dr["id"].ToString());
    70 }
    71
    72 }
    73 tv.Nodes.Insert(0, "ID");
    74 tv.Nodes[0].BackColor = Color.Silver;
    75 }
    76
    77
    78
    79
    80 /// <summary>
    81 /// 节点展开后改变DataGridView
    82 /// </summary>
    83 /// <param name="sender"></param>
    84 /// <param name="e"></param>
    85 private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
    86 {
    87 tableChange();
    88 }
    89 /// <summary>
    90 /// 节点收缩后改变DataGridView
    91 /// </summary>
    92 /// <param name="sender"></param>
    93 /// <param name="e"></param>
    94 private void treeView1_AfterCollapse(object sender, TreeViewEventArgs e)
    95 {
    96 tableChange();
    97 }
    98 string s;
    99 /// <summary>
    100 /// 生成DataView的RowFilter
    101 /// </summary>
    102 /// <param name="tc"></param>
    103 public void GetNode(TreeNodeCollection tc)
    104 {
    105 foreach (TreeNode TNode in tc)
    106 {
    107 if (TNode.IsVisible == false)
    108 {
    109 s += "id<>'" + TNode.Name + "' and ";
    110 }
    111 GetNode(TNode.Nodes);
    112 }
    113 }
    114 /// <summary>
    115 /// 根据当前显示的节点来控制DataGridView的内容显示。
    116 /// </summary>
    117 void tableChange()
    118 {
    119 s = "";
    120 TreeNodeCollection tc = treeView1.Nodes;
    121 GetNode(tc);
    122 if(s.Length>4)
    123 s = s.Remove(s.Length - 4);
    124 dt.DefaultView.RowFilter = s;
    125 dataGridView1.DataSource = dt.DefaultView;
    126 }
    127
    128 }

    转载于:https://www.cnblogs.com/whc-blog/archive/2011/08/29/2157316.html

    展开全文
  • 这是数据库: 这事对应的脚本文件:db_test1.sql /* Navicat MySQL Data Transfer Source Server : local Source Server Version : 50612 Source Host : localhost:3306 Source Database : db_test1 ...

    @sonikk 2013-7-16 0:27:38 ^_^

    这是数据库:

    mysql> use db_test1;
    Database changed
    mysql> select * from tb_tree;
    +----+-------+------+-------+-------+--------+-------------+
    | id | posnr | upp  | downp | leftp | rightp | txt         |
    +----+-------+------+-------+-------+--------+-------------+
    | 61 |     1 |    0 |     4 |  NULL |      2 | 工程1       |
    | 62 |     2 |    0 |     7 |     1 |      3 | 工程2       |
    | 63 |     3 |    0 |  NULL |     2 |   NULL | 工程3       |
    | 64 |     4 |    1 |     9 |  NULL |      5 | 工程1-1     |
    | 65 |     5 |    1 |    12 |     4 |     17 | 工程1-2     |
    | 66 |     6 |    1 |  NULL |    17 |   NULL | 工程1-4     |
    | 67 |     7 |    2 |    15 |  NULL |      8 | 工程2-1     |
    | 68 |     8 |    2 |  NULL |     7 |   NULL | 工程2-2     |
    | 69 |     9 |    4 |  NULL |  NULL |     10 | 工程1-1-1   |
    | 70 |    10 |    4 |    14 |     9 |     11 | 工程1-1-2   |
    | 71 |    11 |    4 |  NULL |    10 |   NULL | 工程1-1-3   |
    | 72 |    12 |    5 |  NULL |  NULL |     13 | 工程1-2-1   |
    | 73 |    13 |    5 |  NULL |    12 |   NULL | 工程1-2-2   |
    | 74 |    14 |   10 |  NULL |  NULL |   NULL | 工程1-1-2-1 |
    | 75 |    15 |    7 |  NULL |  NULL |     16 | 工程2-1-1   |
    | 76 |    16 |    7 |  NULL |    15 |   NULL | 工程2-1-2   |
    | 77 |    17 |    1 |  NULL |     5 |      6 | 工程1-3     |
    | 78 |     0 | NULL |     1 |  NULL |   NULL | 根节点      |
    +----+-------+------+-------+-------+--------+-------------+
    18 rows in set (0.02 sec)
    

    这事对应的脚本文件:

    db_test1.sql

    /*
    Navicat MySQL Data Transfer
    
    Source Server         : local
    Source Server Version : 50612
    Source Host           : localhost:3306
    Source Database       : db_test1
    
    Target Server Type    : MYSQL
    Target Server Version : 50612
    File Encoding         : 65001
    
    Date: 2013-07-15 23:42:30
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `tb_tree`
    -- ----------------------------
    DROP TABLE IF EXISTS `tb_tree`;
    CREATE TABLE `tb_tree` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `posnr` int(11) DEFAULT NULL,
      `upp` int(11) DEFAULT NULL,
      `downp` int(11) DEFAULT NULL,
      `leftp` int(11) DEFAULT NULL,
      `rightp` int(11) DEFAULT NULL,
      `txt` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `posnr_UNIQUE` (`posnr`)
    ) ENGINE=InnoDB AUTO_INCREMENT=79 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of tb_tree
    -- ----------------------------
    INSERT INTO `tb_tree` VALUES ('61', '1', '0', '4', null, '2', '工程1');
    INSERT INTO `tb_tree` VALUES ('62', '2', '0', '7', '1', '3', '工程2');
    INSERT INTO `tb_tree` VALUES ('63', '3', '0', null, '2', null, '工程3');
    INSERT INTO `tb_tree` VALUES ('64', '4', '1', '9', null, '5', '工程1-1');
    INSERT INTO `tb_tree` VALUES ('65', '5', '1', '12', '4', '17', '工程1-2');
    INSERT INTO `tb_tree` VALUES ('66', '6', '1', null, '17', null, '工程1-4');
    INSERT INTO `tb_tree` VALUES ('67', '7', '2', '15', null, '8', '工程2-1');
    INSERT INTO `tb_tree` VALUES ('68', '8', '2', null, '7', null, '工程2-2');
    INSERT INTO `tb_tree` VALUES ('69', '9', '4', null, null, '10', '工程1-1-1');
    INSERT INTO `tb_tree` VALUES ('70', '10', '4', '14', '9', '11', '工程1-1-2');
    INSERT INTO `tb_tree` VALUES ('71', '11', '4', null, '10', null, '工程1-1-3');
    INSERT INTO `tb_tree` VALUES ('72', '12', '5', null, null, '13', '工程1-2-1');
    INSERT INTO `tb_tree` VALUES ('73', '13', '5', null, '12', null, '工程1-2-2');
    INSERT INTO `tb_tree` VALUES ('74', '14', '10', null, null, null, '工程1-1-2-1');
    INSERT INTO `tb_tree` VALUES ('75', '15', '7', null, null, '16', '工程2-1-1');
    INSERT INTO `tb_tree` VALUES ('76', '16', '7', null, '15', null, '工程2-1-2');
    INSERT INTO `tb_tree` VALUES ('77', '17', '1', null, '5', '6', '工程1-3');
    INSERT INTO `tb_tree` VALUES ('78', '0', null, '1', null, null, '根节点');
    


    这是程序执行结果:

    =======================
    [table]:
    id=61, posnr= 1, up= 0, down= 4, left=  , right= 2, txt=工程1
    id=62, posnr= 2, up= 0, down= 7, left= 1, right= 3, txt=工程2
    id=63, posnr= 3, up= 0, down=  , left= 2, right=  , txt=工程3
    id=64, posnr= 4, up= 1, down= 9, left=  , right= 5, txt=工程1-1
    id=65, posnr= 5, up= 1, down=12, left= 4, right=17, txt=工程1-2
    id=66, posnr= 6, up= 1, down=  , left=17, right=  , txt=工程1-4
    id=67, posnr= 7, up= 2, down=15, left=  , right= 8, txt=工程2-1
    id=68, posnr= 8, up= 2, down=  , left= 7, right=  , txt=工程2-2
    id=69, posnr= 9, up= 4, down=  , left=  , right=10, txt=工程1-1-1
    id=70, posnr=10, up= 4, down=14, left= 9, right=11, txt=工程1-1-2
    id=71, posnr=11, up= 4, down=  , left=10, right=  , txt=工程1-1-3
    id=72, posnr=12, up= 5, down=  , left=  , right=13, txt=工程1-2-1
    id=73, posnr=13, up= 5, down=  , left=12, right=  , txt=工程1-2-2
    id=74, posnr=14, up=10, down=  , left=  , right=  , txt=工程1-1-2-1
    id=75, posnr=15, up= 7, down=  , left=  , right=16, txt=工程2-1-1
    id=76, posnr=16, up= 7, down=  , left=15, right=  , txt=工程2-1-2
    id=77, posnr=17, up= 1, down=  , left= 5, right= 6, txt=工程1-3
    id=78, posnr= 0, up=  , down= 1, left=  , right=  , txt=根节点
    =======================
    [travel]:
    id=78, posnr= 0, up=  , down= 1, left=  , right=  , txt=根节点
    id=61, posnr= 1, up= 0, down= 4, left=  , right= 2, txt=工程1
    id=62, posnr= 2, up= 0, down= 7, left= 1, right= 3, txt=工程2
    id=63, posnr= 3, up= 0, down=  , left= 2, right=  , txt=工程3
    id=64, posnr= 4, up= 1, down= 9, left=  , right= 5, txt=工程1-1
    id=65, posnr= 5, up= 1, down=12, left= 4, right=17, txt=工程1-2
    id=77, posnr=17, up= 1, down=  , left= 5, right= 6, txt=工程1-3
    id=66, posnr= 6, up= 1, down=  , left=17, right=  , txt=工程1-4
    id=67, posnr= 7, up= 2, down=15, left=  , right= 8, txt=工程2-1
    id=68, posnr= 8, up= 2, down=  , left= 7, right=  , txt=工程2-2
    id=69, posnr= 9, up= 4, down=  , left=  , right=10, txt=工程1-1-1
    id=70, posnr=10, up= 4, down=14, left= 9, right=11, txt=工程1-1-2
    id=71, posnr=11, up= 4, down=  , left=10, right=  , txt=工程1-1-3
    id=72, posnr=12, up= 5, down=  , left=  , right=13, txt=工程1-2-1
    id=73, posnr=13, up= 5, down=  , left=12, right=  , txt=工程1-2-2
    id=75, posnr=15, up= 7, down=  , left=  , right=16, txt=工程2-1-1
    id=76, posnr=16, up= 7, down=  , left=15, right=  , txt=工程2-1-2
    id=74, posnr=14, up=10, down=  , left=  , right=  , txt=工程1-1-2-1
    =======================
    [result]:
    id=78, posnr= 0, up=  , down= 1, left=  , right=  , txt=根节点
    id=61, posnr= 1, up= 0, down= 4, left=  , right= 2, txt=工程1
    id=64, posnr= 4, up= 1, down= 9, left=  , right= 5, txt=工程1-1
    id=69, posnr= 9, up= 4, down=  , left=  , right=10, txt=工程1-1-1
    id=70, posnr=10, up= 4, down=14, left= 9, right=11, txt=工程1-1-2
    id=74, posnr=14, up=10, down=  , left=  , right=  , txt=工程1-1-2-1
    id=71, posnr=11, up= 4, down=  , left=10, right=  , txt=工程1-1-3
    id=65, posnr= 5, up= 1, down=12, left= 4, right=17, txt=工程1-2
    id=72, posnr=12, up= 5, down=  , left=  , right=13, txt=工程1-2-1
    id=73, posnr=13, up= 5, down=  , left=12, right=  , txt=工程1-2-2
    id=77, posnr=17, up= 1, down=  , left= 5, right= 6, txt=工程1-3
    id=66, posnr= 6, up= 1, down=  , left=17, right=  , txt=工程1-4
    id=62, posnr= 2, up= 0, down= 7, left= 1, right= 3, txt=工程2
    id=67, posnr= 7, up= 2, down=15, left=  , right= 8, txt=工程2-1
    id=75, posnr=15, up= 7, down=  , left=  , right=16, txt=工程2-1-1
    id=76, posnr=16, up= 7, down=  , left=15, right=  , txt=工程2-1-2
    id=68, posnr= 8, up= 2, down=  , left= 7, right=  , txt=工程2-2
    id=63, posnr= 3, up= 0, down=  , left= 2, right=  , txt=工程3
    


    程序的关键算法主要是树的层次遍历(队列) + 链表预算位置+偏移量插入:


    树的逻辑结构:



    向逆时针方向旋转90度后进行找规律:





    DBHelper.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MySql.Data.MySqlClient;
    using System.Windows.Forms;
    using System.Data;
    
    namespace DataBaseTree
    {
        class DBHelper
        {
            public const string server = "127.0.0.1";
            public const string username = "root";
            public const string password = "";
            public const string database = "db_test1";
    
            MySqlConnection mConn = null;
    
            public DBHelper()
            {
                if (mConn == null)
                {
                    mConn = getConn();
                }
            }
    
            ~DBHelper()
            {
                if (mConn != null)
                {
                    mConn.Close();
                    mConn.Dispose();
                    mConn = null;
                }
            }
    
            public void exeNonSql(string sql)
            {
                exeNonSql(mConn, sql);
            }
    
                    // 绑定并查看数据
            public void bindData(DataGridView dgv, string sql)
            {
                bindData(dgv, mConn, sql);
            }
    
            // 执行sql语句获取内存数据表格
            public DataTable queryDataTable(string sql, string table_name)
            {
                return queryDataTable(mConn, sql, table_name);
            }
    
            // ----------------------------------------------------------------
    
            // 获取链接
            private MySqlConnection getConn()
            {
                MySqlConnection conn = new MySqlConnection();
                string connStr = String.Format("server={0};uid={1};pwd={2};database={3}", server, username, password, database);
                conn.ConnectionString = connStr;
                conn.Open();
                return conn;
            }
    
            // 指定一条数据库语句
            private void exeNonSql(MySqlConnection conn, string sql)
            {
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
            }
    
            // 绑定并查看数据
            private void bindData(DataGridView dgv, MySqlConnection conn, string sql)
            {
                MySqlDataAdapter mda = new MySqlDataAdapter(sql, conn);
    
                DataSet ds = new DataSet();
    
                mda.Fill(ds, "tb1");
    
                dgv.DataSource = ds.Tables["tb1"];
            }
    
            // 执行sql语句查询得到内存数据表格
            private DataTable queryDataTable(MySqlConnection conn, string sql, string table_name)
            {
                MySqlDataAdapter mda = new MySqlDataAdapter(sql, conn);
    
                DataSet ds = new DataSet();
    
                mda.Fill(ds, table_name);
    
                return ds.Tables[table_name];
            }
        }
    }
    


    TreeNode.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace DataBaseTree
    {
    
        // 定义tb_tree的表结构
        public class TreeNode
        {
            public int id;
            public string posnr; // 不重复字段
            public string up;
            public string down;
            public string left;
            public string right;
            public string txt;
    
            // 构造函数
            public TreeNode()
            {
                this.id = 0;
                this.posnr = "";
                this.up = "";
                this.down = "";
                this.left = "";
                this.right = "";
                this.txt = "";
            }
    
            // 赋值
            public void set(TreeNode rdata)
            {
                this.id = rdata.id;
                this.posnr = rdata.posnr;
                this.up = rdata.up;
                this.down = rdata.down;
                this.left = rdata.left;
                this.right = rdata.right;
                this.txt = rdata.txt;
            }
    
    
        }
    
    
    
    }
    


    TreeTable.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Collections;
    
    namespace DataBaseTree
    {
        class TreeTable
        {
    
            // 获取数组
            public TreeNode[] getMemoryTableArr(DataTable tb)
            {
                TreeNode[] arr = new TreeNode[tb.Rows.Count];
    
                for (int i = 0; i < tb.Rows.Count; i++)
                {
                    //Console.WriteLine("posnr: " + );
                    TreeNode rdata = new TreeNode();
                    rdata.id = Convert.ToInt32(tb.Rows[i]["id"]);
                    rdata.posnr = tb.Rows[i]["posnr"].ToString();
                    rdata.up = tb.Rows[i]["upp"].ToString();
                    rdata.down = tb.Rows[i]["downp"].ToString();
                    rdata.left = tb.Rows[i]["leftp"].ToString();
                    rdata.right = tb.Rows[i]["rightp"].ToString();
                    rdata.txt = tb.Rows[i]["txt"].ToString();
                    arr[i] = rdata;
                }
    
                return arr;
            }
    
    
            public TreeNode[] getTreeData()
            {
                DBHelper db = new DBHelper();
    
                // 执行sql语句
                db.exeNonSql("set names utf8;");
    
                db.exeNonSql("use db_test1;");
    
                string str_sql = "select * from tb_tree;";
    
                // mDb.bindData(dgv1, str_sql);
    
                DataTable tb1 = db.queryDataTable(str_sql, "tb1");
    
                // 释放数据库类
                db = null;
    
                // 从内存表中提取数据,转化为对象数组
                TreeNode[] arr_table = getMemoryTableArr(tb1);
    
                return arr_table;
            }
    
    
    
            // 入队列
            private void enQueue(ArrayList arr, TreeNode rdata)
            {
                arr.Insert(arr.Count, rdata);
            }
    
            // 出队列
            private TreeNode deQueue(ArrayList arr)
            {
                TreeNode rdata = null;
    
                if (arr.Count > 0)
                {
                    rdata = (TreeNode)arr[0];
                    arr.RemoveAt(0);
                }
    
                return rdata;
            }
    
            // 根据Posnr查找节点
            TreeNode findPosnr(TreeNode[] arr, string posnr)
            {
                TreeNode rdata = null;
                for (int i = 0; i < arr.Length; i++)
                {
                    if (arr[i].posnr == posnr)
                    {
                        rdata = arr[i];
                        break;
                    }
                }
    
                return rdata;
            }
    
            //  查找posnr对应 在队列中的位置
            private int findIndexByPosnr(ArrayList arr, string posnr)
            {
                int index = -1;
                for (int i = 0; i < arr.Count; i++)
                {
                    TreeNode rdata = (TreeNode)arr[i];
                    if (rdata.posnr == posnr)
                    {
                        index = i;
                        break;
                    }
                }
    
                return index;
            }
    
            // 按照right链表连接排序
            public TreeNode[] sortLinkByRight(TreeNode[] arr)
            {
                // 没有数据不排序,返回null
                if (arr == null || arr.Length == 0)
                    return null;
    
                // 只有一个子节点,返回本身,不排序
                if (arr.Length == 1)
                {
                    return arr;
                }
    
                TreeNode[] arr_ret = new TreeNode[arr.Length];
    
                // 找left为空的posnr
                string next_posnr = null;
                for (int i = 0; i < arr.Length; i++)
                {
                    if (arr[i].left == "")
                    {
                        next_posnr = arr[i].posnr;
                        break;
                    }
                }
    
    
                int j = 0;
                do
                {
                    TreeNode rdata = findPosnr(arr, next_posnr);
                    arr_ret[j] = rdata;
                    j++;
                    next_posnr = rdata.right;
    
                } while (next_posnr != "");
    
    
                return arr_ret;
            }
    
            public TreeNode[] findChildByUp(TreeNode[] arr, string up)
            {
                /*
                int count = 0;
    
                // 统计儿子个数
                for (int i = 0; i < arr.Length; i++)
                {
                    if (arr[i].up == up)
                    {
                        count++;
                    }
                }
    
                // 创建儿子数组
                RData[] arr_ret = new RData[count];
    
                int j = 0;
                for (int i = 0; i < arr.Length; i++)
                {
                    if (arr[i].up == up)
                    {
                        arr_ret[j] = arr[i];
                        j++;
                    }
                }
    
                return arr_ret;
                */
    
                ArrayList arr_ret = new ArrayList();
    
                for (int i = 0; i < arr.Length; i++)
                {
                    if (arr[i].up == up)
                    {
                        arr_ret.Add(arr[i]);
                    }
                }
    
                return (TreeNode[])arr_ret.ToArray(typeof(TreeNode));
            }
    
            // 查找up,并返回有序的数据集
            public TreeNode[] findChildByUpOrdered(TreeNode[] arr, string up)
            {
                // 查找
                TreeNode[] arr_ret = findChildByUp(arr, up);
    
                //orderByLeft(arr_ret);
    
                arr_ret = sortLinkByRight(arr_ret);
    
    
                return arr_ret;
            }
    
            // 层次遍历
            public void travel(TreeNode[] arr_table, ArrayList queue, ArrayList list_result)
            {
                TreeNode rdata = null;
                do
                {
                    // 出队一个节点
                    rdata = deQueue(queue);
    
                    if (rdata == null)
                        continue;
    
                    // 按层次遍历输出
                    Console.WriteLine("id={0,2}, posnr={1,2}, up={2,2}, down={3,2}, left={4,2}, right={5,2}, txt={6,2}", rdata.id, rdata.posnr, rdata.up, rdata.down, rdata.left, rdata.right, rdata.txt);
    
                    // 查找出队节点的儿子节点
                    TreeNode[] children = findChildByUpOrdered(arr_table, rdata.posnr);  // up = null
    
                    // 查找posnr对应的的位置
                    int insert_index = findIndexByPosnr(list_result, rdata.posnr);
                    if (children != null)
                    {
                        for (int i = 0; i < children.Length; i++)
                        {
                            // 儿子入队
                            enQueue(queue, children[i]);
    
                            // 将儿子插入到posnr节点之后,计算: 插入位置 = 父位置 + 偏移量
                            list_result.Insert(insert_index + i + 1, children[i]);
                        }
                    }
    
    
                } while (rdata != null);
    
            }
    
            // 格式化输出全部数组
            public void printArray(TreeNode[] arr)
            {
                for (int i = 0; i < arr.Length; ++i)
                {
                    TreeNode rdata = arr[i];
                    Console.WriteLine("id={0,2}, posnr={1,2}, up={2,2}, down={3,2}, left={4,2}, right={5,2}, txt={6}", rdata.id, rdata.posnr, rdata.up, rdata.down, rdata.left, rdata.right, rdata.txt);
                }
            }
    
            // 格式化输出ArrayList
            public void printArray(ArrayList al)
            {
                for (int i = 0; i < al.Count; ++i)
                {
                    TreeNode rdata = (TreeNode)al[i];
                    Console.WriteLine("id={0,2}, posnr={1,2}, up={2,2}, down={3,2}, left={4,2}, right={5,2}, txt={6}", rdata.id, rdata.posnr, rdata.up, rdata.down, rdata.left, rdata.right, rdata.txt);
                }
            }
    
            // [main] 生成数据树形结构的菜单
            public void GenerateTreeMenu()
            {
                TreeNode[] arr_table = getTreeData();
    
                Console.WriteLine("=======================");
                Console.WriteLine("[table]:");
                printArray(arr_table);
    
    
                // 创建队列
                ArrayList queue = new ArrayList();
    
                // 创建结果List
                ArrayList list_result = new ArrayList();
    
                // 建立初始队列, 插入根节点 (指定up为NULL的)
                TreeNode[] children = findChildByUpOrdered(arr_table, "");  // up = null
                for (int i = 0; i < children.Length; i++)
                {
                    enQueue(queue, children[i]);
    
                    // 插入结果
                    list_result.Add(children[i]);
                }
    
                Console.WriteLine("=======================");
                Console.WriteLine("[travel]:");
                travel(arr_table, queue, list_result);
    
                Console.WriteLine("=======================");
                Console.WriteLine("[result]:");
                printArray(list_result);
    
            }
    
    
    
        }
    }
    


    @sonikk 2013-7-16 0:27:38 ^_^ /~


    展开全文
  • 历时数月,RDIFramework.NET V2.8版本发布了,感谢大家的支持。  RDIFramework.NET,基于.NET的快速...框架采用目前最主流的C#语言开发完成,支持多种数据库类型,支持WinForm与Web。使用RDIFramework.NET能提高管理
  • 由于在介绍通用数据管理模块功能的时候用到了许多通用的功能,例如word和excel与DataGridView控件的相互导入导出、写日志到数据库中等等。为了后面每一篇文章都能清楚的知道每一个功能具体是怎么实现的,现在先统一...
  • 改变应用图标 1.当“解决方案资源管理器”中有项目选中时,在“项目”菜单上单击“属性”。  2.选择“应用程序”窗格。 3.从“图标”下拉列表中选择图标 (.ico) 文件。 ...
  • 上一篇文章把整个系统的主界面实现了,接下来就是实现主界面上提供的各个功能模块。首先介绍的是通用数据管理模块,为什么称为通用数据呢?因为这些数据和我们平时使用关系型数据库管理的数据是类似的,这里称为通用...
1 2
收藏数 39
精华内容 15
热门标签