نحوه پر کردن و اضافه کردن یک گره جدید به TreeView ازبانک اطلاعاتی

جمعه 20 فروردین 1395

در این مقاله ، ابتدا یک مرور کلی بر TreeView و اجزای سازنده ی آن می کنیم. سپس طریقه ی ایجاد و پر کردن یک TreeView در زبان #C را در چند گام ساده و به وسیله ی ساخت یک برنامه بررسی می کنیم.

نحوه پر کردن و اضافه کردن یک گره  جدید به TreeView ازبانک اطلاعاتی

در این مقاله یاد خواهیم گرفت که چگونه می توانیم یک TreeView را پر کنیم و گره های جدیدی به آن اضافه کنیم. کنترل TreeView برای نمایش اطلاعات به صورت سلسله مراتبی استفاده می شود. در ساختار TreeView از گره های قابل گسترش استفاده شده است. کنترل TreeView در window form ها و در WPF در دسترس است.

با خواندن این مقاله ، شما قادر خواهید بود یک گره ی جدید در هر سطح دلخواه به کنترل Tree View  اضافه کنید.بخش "Code" نیز به صورت اتوماتیک برای هر گره ی جدید ایجاد می شود.

1- ساختار پایگاه داده

در ابتدا ، یک جدول پایگاه داده با استفاده از مدلی که در زیر داده شده است، بسازید. ما در این مقاله ، فقط از یک جدول استفاده می کنیم، زیرا می خواهیم آن را تا سطح  N گسترش بدهیم.

    CREATE TABLE [dbo].accounts(  
        [code] [int] NOTNULL,  
        [ac_name] [nvarchar](50)NOTNULL,  
        [parent] [int] NOTNULL,  
        [type] [nvarchar](20)NOTNULL,  
        [levelno] [int] NOTNULL,  
        [fixed] [nvarchar](50)NULL,  
        [direct] [nvarchar](50)NULL,  
        [open_bal] [decimal](18, 2)NULL,  
        [dt] [datetime] NULLCONSTRAINT [DF_chart_dt]  DEFAULT (getdate()),  
        [active] [int] NOTNULLCONSTRAINT [DF_chart_active]  DEFAULT ((1)),  
        [cntr] [int] IDENTITY(1,1)NOTNULL,  
    CONSTRAINT [PK_chart] PRIMARYKEYCLUSTERED  
    (  
        [code] ASC  
    )WITH (PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON [PRIMARY]  
    )ON [PRIMARY]  

فیلد "Code" کلید اصلی جدول ما خواهد بود که برای شناسایی هر  account  مورد استفاده قرار می گیرد. برنامه به صورت خودکار ، برای هر گره ی جدید ،این بخش را تولید می کند.

2- چند داده به صورت فرضی به جدول اضافه کنید.

GO  
SETIDENTITY_INSERT[dbo].accounts ON  
GO  
INSERT[dbo].accounts([code], [ac_name], [parent], [type], [levelno], [fixed], [direct], [open_bal], [dt], [active], [cntr]) VALUES(1, N 'Assets', 0, N 'Parent Account', 0, N 'NA', N 'NA', CAST(0.00 ASDecimal(18, 2)), CAST(N '2015-02-23 21:09:27.327'  
    ASDateTime), 1, 1)  
GO  
INSERT[dbo].accounts([code], [ac_name], [parent], [type], [levelno], [fixed], [direct], [open_bal], [dt], [active], [cntr]) VALUES(2, N 'Liabilities', 0, N 'Parent Account', 0, N 'NA', N 'NA', CAST(0.00 ASDecimal(18, 2)), CAST(N '2015-02-23 21:09:27.327'  
    ASDateTime), 1, 2)  
GO  
INSERT[dbo].accounts([code], [ac_name], [parent], [type], [levelno], [fixed], [direct], [open_bal], [dt], [active], [cntr]) VALUES(3, N 'Equity', 0, N 'Parent Account', 0, N 'NA', N 'NA', CAST(0.00 ASDecimal(18, 2)), CAST(N '2015-02-23 21:09:27.327'  
    ASDateTime), 1, 3)  
GO  
INSERT[dbo].accounts([code], [ac_name], [parent], [type], [levelno], [fixed], [direct], [open_bal], [dt], [active], [cntr]) VALUES(4, N 'Revenue', 0, N 'Parent Account', 0, N 'Variable', N 'Indirect', CAST(0.00 ASDecimal(18, 2)), CAST(N '2015-02-26 00:00:00.000'  
    ASDateTime), 1, 38)  
GO  
INSERT[dbo].accounts([code], [ac_name], [parent], [type], [levelno], [fixed], [direct], [open_bal], [dt], [active], [cntr]) VALUES(101, N 'Current Assets', 1, N 'Parent Account', 1, N 'NA', N 'NA', CAST(0.00 ASDecimal(18, 2)), CAST(N '2015-02-23 21:09:27.327'  
    ASDateTime), 1, 4)  
GO  
INSERT[dbo].accounts([code], [ac_name], [parent], [type], [levelno], [fixed], [direct], [open_bal], [dt], [active], [cntr]) VALUES(102, N 'Fixed Assets', 1, N 'Parent Account', 1, N 'NA', N 'NA', CAST(0.00 ASDecimal(18, 2)), CAST(N '2015-02-23 21:09:27.327'  
    ASDateTime), 1, 5)  
GO  
INSERT[dbo].accounts([code], [ac_name], [parent], [type], [levelno], [fixed], [direct], [open_bal], [dt], [active], [cntr]) VALUES(201, N 'Short Term Liabilities', 2, N 'Parent Account', 1, N 'NA', N 'NA', CAST(0.00 ASDecimal(18, 2)), CAST(N '2015-02-23 21:09:27.327'  
    ASDateTime), 1, 6)  
GO  
INSERT[dbo].accounts([code], [ac_name], [parent], [type], [levelno], [fixed], [direct], [open_bal], [dt], [active], [cntr]) VALUES(202, N 'Long Term Liabilities', 2, N 'Parent Account', 1, N 'NA', N 'NA', CAST(0.00 ASDecimal(18, 2)), CAST(N '2015-02-23 21:09:27.327'  
    ASDateTime), 1, 7)  
GO  
SETIDENTITY_INSERT[dbo].accounts OFF  
GO 

3- TreeView را پر کنید.

بعد از این که جدول را ساختیم و داده ها را به آن اضافه کردیم ، حالا می توانیم آن ها را به TreeView اضافه کنیم.

مراحل این کار عبارتند از :

یک پروژه winform  در برنامه ی Visual Studio  ایجاد کنید.

یک TreeView به درون فرم بکشید.

یک context menu به فرم اضافه کنید.  این context menu عملیات زیر را انجام می دهد:

-اطلاعات یک گره ی خاص را نمایش می دهد.

-یک گره را به سطح جاری اضافه می کند.

-یک گره ی جدید در زیر گره ی انتخابی اضافه می کند.

بر روی فرم ، دابل کلیک کنید و رویداد Form_Load  را ایجاد کنید. ما درخت را در زمان بارگذاری فرم ، پر می کنیم.

در حالی که فرم در حال بارگذاری  است ، ما اطلاعات را از SQL Server می گیریم و در datatable ذخیره می کنیم.

تابع زیر ، داده ها را در جدول TreeView می ریزد.

  Populate Tree Viewیک تابع بازگشتی است . این تابع تا زمانی که دیگر گره ای برای نشان دادن در  Tree View موجود نباشد، خودش را فراخوانی می کند.

    private void PopulateTreeView(int parentId, TreeNode parentNode)  
    {  
        TreeNode childNode;  
        foreach(DataRow dr in _acountsTb.Select("[parent]=" + parentId))  
        {  
            TreeNode t = new TreeNode();  
            t.Text = dr["code"].ToString() + " - " + dr["ac_name"].ToString();  
            t.Name = dr["code"].ToString();  
            t.Tag = _acountsTb.Rows.IndexOf(dr);  
            if (parentNode == null)  
            {  
                treeView1.Nodes.Add(t);  
                childNode = t;  
            }  
            else  
            {  
                parentNode.Nodes.Add(t);  
                childNode = t;  
            }  
            PopulateTreeView(Convert.ToInt32(dr["code"].ToString()), childNode);  
        }  
    }  

4- نمایش اطلاعات گره

تابع زیر برای نمایش جزئیات یک گره ی مشخص به کار رفته است.

    private void ShowNodeData(TreeNode nod)  
    {  
        DataRow r = _acountsTb.Rows[int.Parse(nod.Tag.ToString())];  
        txtCode.Text = r["code"].ToString();  
        txtName.Text = r["ac_name"].ToString();  
        dtpDate.Value = DateTime.Parse(r["dt"].ToString());  
        textBox1.Text = r["open_bal"].ToString();  
        if (r["type"].ToString().Equals("Parent Account"))  
        {  
            radioParent.Checked = true;  
            textBox1.Enabled = false;  
        }  
        
        else radioTransaction.Checked = true;  
        
        if (r["fixed"].ToString().Equals("NA")) radioNA1.Checked = true;  
        
        elseif(r["fixed"].ToString().Equals("Fixed"))  
          
        radioFixed.Checked = true;  
        
        else radioVariable.Checked = true;  
        
        if (r["direct"].ToString().Equals("NA")) radioNA2.Checked = true;  
        
        elseif(r["direct"].ToString().Equals("Direct"))  
          
        radioDirect.Checked = true;  
        
        else radioIndirect.Checked = true;  
        
        txtName.Focus();  
    }  

5- اضافه کردن یک گره در سطح جاری

event handler زیر ، عمل کلیک کردن بر روی آیتم " سطح جاری " از context menu را کنترل می کند. این رویداد، ابتدا یک کد برای آیتم جدیدی که می خواهد درج بشود، ایجاد می کند.

privatevoid atThisLevelToolStripMenuItem_Click(object sender, EventArgs e)  
{  
    _selectedNode = treeView1.SelectedNode;  
    int max = 0;  
    if (treeView1.Nodes.Count > 0)  
    {  
        _parent = int.Parse(_acountsTb.Rows[int.Parse(_selectedNode.Tag.ToString())]["parent"].ToString());  
        DataRow[] nodes = _acountsTb.Select("[parent]=" + _parent);  
        foreach(DataRow r in nodes)  
        {  
            int n = int.Parse(r["code"].ToString());  
            if (n > max) max = n;  
        }  
    }  
    max += 1;  
    txtCode.Text = max.ToString();  
    _newNode = true;  
    _thisLevel = true;  
    txtName.Focus();  
} 

6- اضافه کردن یک گره  به عنوان فرزند گره دیگر

event handler زیر ، عمل کلیک کردن بر روی " گره ی فرزندی که توسط کاربر انتخاب شده است " را کنترل می کند. این رویداد ، در ابتدا یک کد برای آیتم جدیدی که می خواهد درج بشود، ایجاد می کند.

private void underSelectedToolStripMenuItem_Click(object sender, EventArgs e)  
{  
    _selectedNode = treeView1.SelectedNode;  
    DataRow r = _acountsTb.Rows[int.Parse(treeView1.SelectedNode.Tag.ToString())];  
    if (r["type"].ToString().Equals("Parent Account"))  
    {  
        _newNode = true;  
        _thisLevel = false;  
        string code = string.Empty;  
        _parent = int.Parse(_acountsTb.Rows[int.Parse(_selectedNode.Tag.ToString())]["code"].ToString());  
        if (_selectedNode.Nodes.Count > 0)  
        {  
            DataRow[] nodes = _acountsTb.Select("[parent]=" + _parent);  
            int max = 0;  
            foreach(DataRow ra in nodes)  
            {  
                int n = int.Parse(ra["code"].ToString());  
                if (n > max) max = n;  
            }  
            max += 1;  
            txtCode.Text = max.ToString();  
            code = max.ToString();  
        }  
        else  
        {  
            if (_selectedNode.Level < 3) code = "01";  
            else code = "001";  
            txtCode.Text = r["code"] + code;  
        }  
        txtName.Focus();  
    }  
    else  
    {  
        _newNode = false;  
        MessageBox.Show("New Account can't be opened under a Transaction Account", "Acount opening Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);  
    }  
} 

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 6k بازدید
  • 10 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید