Привязка данных базы данных к древовидному представлению с помощью c # в приложениях winforms - PullRequest
0 голосов
/ 23 августа 2011

У меня есть таблица с именем категории .... со столбцами ...

                                category_id
                                categoryname

Я хочу представлять имена категорий только в виде дерева ....

возможно ли привязать имена категорий к древовидной структуре следующим образом ...

                           Category 
                              categoryname 1
                              categoryname 2
                              categoryname 3

возможно ли использование c # .. Я использую приложения Windows ....

Может ли кто-нибудь помочь с этим ...

Большое спасибо заранее ..

Ответы [ 3 ]

1 голос
/ 04 декабря 2016

в других веб-формах вы можете просто привязать набор данных к вашему древовидному элементу управления, но в выигрышных формах нет никакой базы данных.В этом примере я наследую класс System.Windows.Forms.TreeView и пишу свой собственный код для привязки набора данных к элементу управления Win Treeview, и я использую его в своем приложении более 3 лет, и он отлично работает.

Первое: вынеобходимо создать класс как Custom_Tree_View.cs и добавить в него нижеприведенный код

 public class Custom_Tree_View : System.Windows.Forms.TreeView
{
    DataSet dsMenu = new DataSet();
    public TreeNodeMouseClickEventHandler TreeNode_Click_Event;

    float FontSize = 9F;
    string FontName = "Tahoma";
    public string Data_Key_Member;
    public string Data_Key_Value;
    private ImageList imageList1;
    private System.ComponentModel.IContainer components;
    public string Data_Parent_Key;


    public bool ShowCheckBox = false;

    public Custom_Tree_View()
    {
        this.Font = new System.Drawing.Font(this.FontName, this.FontSize);          
        this.NodeMouseClick += NodeMouseClicked;
    }


    public void CreateMenu(DataSet _dsMenu)
    {
        try
        {

            this.Nodes.Clear();

            if (_dsMenu == null) return;
            this.CheckBoxes = this.ShowCheckBox;
            this.dsMenu = _dsMenu;

            string Filter = this.Data_Parent_Key + " IS NULL";
            foreach (DataRow drTemp in dsMenu.Tables[0].Select(Filter))
            {
                Create_Parent_Tree_Node(drTemp[0].ToString());
            }



        }
        catch (Exception ex)
        {
            throw ex;
        }
    }




    private void Create_Parent_Tree_Node(string strMenu)
    {
        try
        {

            TreeNode mmru = new TreeNode(GetMenu_Details_Title(strMenu));
            mmru.Name = strMenu;
            if (dsMenu.Tables[0].Select(this.Data_Parent_Key + "='" + strMenu + "'").Length > 0)
            {

                this.Nodes.Add(mmru);
                foreach (DataRow drTemp in dsMenu.Tables[0].Select(this.Data_Parent_Key + "='" + strMenu + "'"))
                {
                    Create_Child_Tree_Node(mmru, drTemp[0].ToString());
                }
            }
            else
            {
                mmru.ForeColor = System.Drawing.Color.Red;
                this.Nodes.Add(mmru);
            }


        }
        catch (Exception ex)
        {
            throw ex;
        }
    }


    private string Create_Child_Tree_Node(TreeNode mnuItem, string strMenu)
    {
        try
        {
            if (dsMenu.Tables[0].Select(this.Data_Parent_Key + "='" + strMenu + "'").Length > 0)
            {
                TreeNode mmru = new TreeNode(GetMenu_Details_Title(strMenu));

                mmru.Name = strMenu;
                mnuItem.Nodes.Add(mmru);
                foreach (DataRow drTemp1 in dsMenu.Tables[0].Select(this.Data_Parent_Key + "='" + strMenu + "'"))
                {

                    Create_Child_Tree_Node(mmru, drTemp1[0].ToString());
                }
            }
            else
            {
                TreeNode mmru = new TreeNode(GetMenu_Details_Title(strMenu));
                mmru.Name = strMenu;
                mmru.ForeColor = System.Drawing.Color.Red;

                mnuItem.Nodes.Add(mmru);
                return strMenu;
            }
            return strMenu;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private string GetMenu_Details_Title(string TreeNode_ID)
    {

        try
        {              
            return dsMenu.Tables[0].Select(this.Data_Key_Value + "=" + TreeNode_ID + "")[0][this.Data_Key_Member].ToString();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private bool GetMenuEnable(string TreeNode_ID)
    {
        try
        {
            if (dsMenu.Tables[0].Select(this.Data_Key_Value + "='" + TreeNode_ID + "'")[0][3].ToString() == "Y")
                return true;
            else
                return false;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }


    public TreeNode SelectedTreeNode;


    private void NodeMouseClicked(object sender, TreeNodeMouseClickEventArgs e)
    {
        try
        {                

            if (dsMenu.Tables[0].Select(this.Data_Parent_Key + "='" + e.Node.Name + "'").Length > 0)
            {
                return;
            }
            else
            {
                if (this.TreeNode_Click_Event != null)
                    TreeNode_Click_Event(sender, e);
            }


        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.imageList1 = new System.Windows.Forms.ImageList(this.components);
        this.SuspendLayout();
        // 
        // imageList1
        // 
        this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
        this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
        this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
        // 
        // Custom_Tree_View
        // 
        this.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(178)));
        this.ItemHeight = 25;
        this.LineColor = System.Drawing.Color.Black;
        this.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
        this.RightToLeftLayout = true;
        this.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.Custom_Tree_View_NodeMouseClick);

        this.ResumeLayout(false);

    }

    private void Custom_Tree_View_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        try
        {
            if (e.Node.Checked == true)
            {

                foreach (TreeNode Node in e.Node.Nodes)
                {

                    Node.Checked = true;
                }
            }



            if (e.Node.Checked == false)
            {

                foreach (TreeNode Node in e.Node.Nodes)
                {

                    Node.Checked = false;
                }
            }






        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.Message);
        }
    }

}

секунда:
в вашем проекте, добавив новый элемент управления в ваши формы и записать код ниже для привязки набора данных к элементу управления древовидной структуры

DataSet Menu_Ds = new DataSet();              
Menu_Ds =  GetMyDataSet();
this.custom_Tree_View_Menu.Data_Key_Member = "Menu_Details_Title";
this.custom_Tree_View_Menu.Data_Key_Value ="Menu_Details_Id";
this.custom_Tree_View_Menu.Data_Parent_Key = "Menu_Details_Parent";
this.custom_Tree_View_Menu.CreateMenu(Menu_Ds);

Обратите внимание: в вашем наборе данных у вас должны быть поля дерева Title, ID и Parent_Id, чтобы правильно создать представление дерева

Я надеюсь, что этот пост будет полезен для всех, и я извиняюсь за мой плохой английский

1 голос
/ 23 августа 2011

Это то, чего вы не можете достичь в Windows Forms, используя стандартное древовидное управление, но это возможно.

Лучший подход - получить собственный контроль от TreeView, создать свойство DataSource. После назначения DataSource ваш элемент управления должен построить свою структуру на основе данных. Вам могут потребоваться некоторые дополнительные свойства для описания столбца с текстом узла и столбца с идентификатором и идентификатором родителя.

Если вы хотите использовать более полный подход, вам также следует рассмотреть возможность подписки на какое-либо дополнительное событие для объекта DataSource и реагирования на изменения события DataSource.

Интересное решение для проектирования заключается в том, хотите ли вы построить целое дерево за один раз или подождать, пока пользователь развернет данный узел.

Вы также можете найти как минимум 2 рабочих примера в CodeProject:

0 голосов
/ 14 февраля 2014
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        MenuDS ds = new MenuDS();

        CategoryTableAdapter daCategory = new CategoryTableAdapter();
        ProductTableAdapter daProduct = new ProductTableAdapter();

        daCategory.Fill(ds.Category);
        daProduct.Fill(ds.Product);

        if (ds.Tables[0].Rows.Count > 0)
        {
            TreeView1.Nodes.Clear();
            foreach (DataRow dr in ds.Category.Rows)
            {
                TreeNode mastreNode = new TreeNode(dr["cateNAme"].ToString(), dr["Id"].ToString());
                TreeView1.Nodes.Add(mastreNode);
                TreeView1.CollapseAll();

                DataTable dt = daProduct.GetDataBy(Convert.ToInt32((dr["Id"])));

                foreach (DataRow drNew in dt.Rows)
                {
                    TreeNode childNode = new TreeNode(drNew["prodName"].ToString(), drNew["Id"].ToString());
                    childNode.NavigateUrl = "~/ProductDetails.aspx?Id=" + drNew["Id"].ToString();
                    mastreNode.ChildNodes.Add(childNode);

                }
            }
        }
    }



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...