пятница, 15 мая 2015 г.

C# WPF. Создать TreeView из базы MySQL с несколькими уровнями узлов

Table1: 'id'-int, 'pid'-int (parent), 'sName'-string
1,0,"itm1"
2,1,"itm2"
3,2,"itm3"

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MySql.Data.MySqlClient; //MySql.Data.dll
using System.Data;

namespace _WpfApp
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private MySqlConnection conn;
        private MySqlCommand selectCommand;
        private MySqlDataReader reader;
        private DataTable dt;

        private void mn(string s)
        {
            if (s == "Определить параметры подключения к БД") cnBD();
            if (s == "Прочитать из БД в поток") setMySQL2reader();
            if (s == "Локальная БД для TreeView") LocBD2TreeView();
            if (s == "Очистить TreeView") TreeView1.Items.Clear();
            if (s == "Заполнить TreeView из локальной БД") setTreeView(null, "0");
        }

        public MainWindow() //Куда уж без тебя
        {
            InitializeComponent();
        }
       
        private void cnBD() //Определить параметры подключения к БД
        {
            string cn = "server=localhost; user id=%user%; password='%password%'; database=test";
            conn = new MySqlConnection(cn);
            conn.Open();
        }

        private void setMySQL2reader() //Прочитать из БД в поток
        {
            string mySelectQuery = "SELECT id, pid, SName FROM table1";
            selectCommand = new MySqlCommand(mySelectQuery, conn);
            reader = selectCommand.ExecuteReader();
        }

        private void LocBD2TreeView() //Локальная БД для TreeView
        {
            dt = new DataTable("dtTree");
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("pid", typeof(int));
            dt.Columns.Add("sName", typeof(string));

            while (reader.Read())
            {
                dt.Rows.Add(reader.GetInt32("id"), reader.GetInt32("pid"), reader.GetString("sName"));
            }

            selectCommand.Connection.Close();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            mn("Определить параметры подключения к БД");
            mn("Прочитать из БД в поток");
            mn("Локальная БД для TreeView");
            mn("Очистить TreeView");
            mn("Заполнить TreeView из локальной БД");
        }

// Собственно ради чего заметка писалась:
        private void setTreeView(TreeViewItem parItem, string parent) //Заполнить TreeView из локальной БД
        {
            foreach (DataRow dr in dt.Rows)
            {
                if (dr["pid"].ToString() == parent)
                {
                    TreeViewItem chItem = new TreeViewItem();
                    chItem.Header = dr["sName"].ToString();
                    setTreeView(chItem, dr["id"].ToString()); //Рекурсия
                    if (parItem == null & parent == "0") TreeView1.Items.Add(chItem); //TreeView root-Header
                    else parItem.Items.Add(chItem);
                }
            }
        }
    }
}

Комментариев нет:

Отправить комментарий