70٪ تخفیف ویژه جشنواره تابستانه توسینسو
پایان تخفیف تا:
مشاهده دوره‌ها
0

مشکل با ثبت اطلاعات treeview در دیتابیس

سلام به اساتید گرامی

من توی یک فرم که با سی شارپ دارم مینویسم از treeview برای مدیریت سطح دسترسی کاربران دارم استفاده می کنم

خب وقتی دارم اطلاعات treeview روی درون یه جدول دیتابیس میریزم

با این تکه کد :

                tbl_level tbl_level = new tbl_level
                {
                    //bankform_info
                    bank_btninfo = tvbank.Nodes["info"].Checked,
                    bank_btninfo_create = tvbank.Nodes["info_c"].Checked,
                    bank_btninfo_edit = tvbank.Nodes["info_e"].Checked,
                    bank_btninfo_delete = tvbank.Nodes["info_d"].Checked,
                    bank_btninfo_read = tvbank.Nodes["info_r"].Checked,
                    //bankform_db
                    bank_btndb = tvbank.Nodes["db"].Checked,
                    bank_btndb_create = tvbank.Nodes["db_c"].Checked,
                    bank_btndb_edit = tvbank.Nodes["db_e"].Checked,
                    bank_btndb_delete = tvbank.Nodes["db_d"].Checked,
                    bank_btndb_read = tvbank.Nodes["db_r"].Checked,
                };
                database.tbl_level.Add(tbl_level);
                database.SaveChanges();

دچار مشکل میشم

خب به ازای هر کدوم از مولفه های بالا من درون جدولم یک ستون از نوع bit درست کردم که true یا false میگیره

خب اینجا من دو تا والد دارم که هر کدام 4 تا چایلد داره

وقتی من دکمه ثبت رو میزنم در صورتیکه کاربر نخواد والدی یا چایلدی رو تیک بزنه یه مشکل پیش میاد و اون هم اینه که میشه والد تیک نخوره و اون به عنوان false درون جدول ذخیره میشه ولی چایلد وقتی بدون تیک رها میشه خطا گرفته میشه

عکس از خطای صورت گرفته

ممنونم میشم راهنمایی کنید ، باتشکر

پرسیده شده در 1396/10/09 توسط

6 پاسخ

0

ممنون جناب عادلی عزیز

منظورتون این هست که با یک if چک کنم اگر null بود خودم برای اون مورد false ارسال کنم و اگر نبود true ارسال کنم؟

اینطوری که کد من خیلی طولانی میشه

فکر کنم متوجه منظورتون نشدم ممنون میشم یه مورد رو توی کدنویسیش راهنمایی بفرمایید ، ممنون

پاسخ در 1396/10/11 توسط
1

سلام به شما دوست عزیز

شما باید قبل از این که مقدار Checked را بررسی کنید بررسی کنید که مقدار نود شما null نباشد.

پاسخ در 1396/10/10 توسط
0

ممنون میشم اساتید اگر در این زمینه تجربه ای دارند راهنمایی بفرمایند

متشکرم

پاسخ در 1396/10/12 توسط
0

دوستان من همچنان التماس دعا دارم

در نهایت به این کد رسیدم

private void TreeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (treeView1.Enabled)
            {
                treeView1.AfterCheck -= TreeView1_AfterCheck;
 
                TreeNode node = e.Node;
 
                if (node.Nodes != null)
                    node.Nodes.Cast<TreeNode>().ToList().ForEach(v => v.Checked = node.Checked);
 
                node = e.Node.Parent;
                while (node != null)
                {
                    bool set = e.Node.Checked
                               ? node.Nodes.Cast<TreeNode>()
                                .Any(v => v.Checked == e.Node.Checked)
                               : node.Nodes.Cast<TreeNode>()
                                .All(v => v.Checked == e.Node.Checked);
                    if (set)
                    {
                        node.Checked = e.Node.Checked;
                        node = node.Parent;
                    }
                    else
                        node = null;
                }
 
                treeView1.AfterCheck += TreeView1_AfterCheck;
            }
        }

فقط همون مشکلی که گفتم هنوز پا برجاست

اگر به صورت فاصله دار کلیک کنم روی والد یا چایلد همه چیز درست کار می کنه اما اگر بدون فاصله کلیک کنم یعنی یه چیز مثل دوبار کلیک دیگه توازن به هم میخوره یعنی چایلد تیک خورده و والد نه و همینطور بالعکس

لطفا راهنمایی کنید ممنون

پاسخ در 1396/10/13 توسط
0

سلام مجدد به اساتید عزیز

خب من رفتم tag هر کدم از چایلدها رو برابر با null گذاشتم مشکل حل شد خدا رو شکر و دیگه نیازی به چک کردن null بودن یا نبودنش نداشت ممنون از جناب عادلی عزیز

الان یه مشکل دیگه دارم

من میخوام هر وقت یه والد تیک خورد همه چایلدهاش هم تیک بخورن و مورد دوم که مهمتر هست اگر یه چایلد تیک خورد حتما حتما والدش تیک بخوره و دیگه نتونه تیک والدش رو برداره و درصورتیکه برداشته شد تیک چایلدها هم حذف بشن

چرا ؟

چون دقیقا این والدها مساوی با منوهای من در فرم سی شارپی ام هستند و چایلدها هم مساوی با زیر منوهاشون

دیگه فک کنم منظورم رو رسونده باشم (نمیشه زیر منو باشه ولی منوی اصلی نباشه ... !!!)

برای مورد اول که اگر والد تیک بخوره چایلدها هم تیک بخورن این تیکه کد رو پیدا کردم :

        private void tvbank_AfterCheck(object sender, TreeViewEventArgs e)
        {
            tvbank.SelectedNode = null;
            if (e.Action != TreeViewAction.Unknown)
            {
                if (e.Node.Nodes.Count > 0)
                {
                    this.CheckAllChildNodes(e.Node, e.Node.Checked);
                }

            }
        }

        private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
        {
            foreach (TreeNode node in treeNode.Nodes)
            {
                node.Checked = nodeChecked;
                if (node.Nodes.Count > 0)
                {
                    this.CheckAllChildNodes(node, nodeChecked);
                }
            }
        }

اما همین هم به درستی کار نمی کنه

وقتی به آرامی و با یکبار کلیک روی والد کلیک می کنم درست کار می کنه یعنی با زدن تیک والد چایلدها هم تیک میخورن و با برداشتنش تیک اونها هم برداشته میشه ولی اگر دوبار کلیک بشه کار خراب میشه و این قضیه برعکس میشن

ممنون میشم اساتید عزیز مخصوصا استاد احمدی عزیز راهنمایی بفرمایند

متشکرم

پاسخ در 1396/10/11 توسط

پاسخ شما