مشکل با ثبت اطلاعات 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 درون جدول ذخیره میشه ولی چایلد وقتی بدون تیک رها میشه خطا گرفته میشه
ممنونم میشم راهنمایی کنید ، باتشکر
6 پاسخ
ممنون جناب عادلی عزیز
منظورتون این هست که با یک if چک کنم اگر null بود خودم برای اون مورد false ارسال کنم و اگر نبود true ارسال کنم؟
اینطوری که کد من خیلی طولانی میشه
فکر کنم متوجه منظورتون نشدم ممنون میشم یه مورد رو توی کدنویسیش راهنمایی بفرمایید ، ممنون
سلام به شما دوست عزیز
شما باید قبل از این که مقدار Checked را بررسی کنید بررسی کنید که مقدار نود شما null نباشد.
ممنون میشم اساتید اگر در این زمینه تجربه ای دارند راهنمایی بفرمایند
متشکرم
دوستان من همچنان التماس دعا دارم
در نهایت به این کد رسیدم
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; } }
فقط همون مشکلی که گفتم هنوز پا برجاست
اگر به صورت فاصله دار کلیک کنم روی والد یا چایلد همه چیز درست کار می کنه اما اگر بدون فاصله کلیک کنم یعنی یه چیز مثل دوبار کلیک دیگه توازن به هم میخوره یعنی چایلد تیک خورده و والد نه و همینطور بالعکس
لطفا راهنمایی کنید ممنون
دوستان کسی کمک نمی کنه !!!!!!!!!!!!!!!
سلام مجدد به اساتید عزیز
خب من رفتم 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); } } }
اما همین هم به درستی کار نمی کنه
وقتی به آرامی و با یکبار کلیک روی والد کلیک می کنم درست کار می کنه یعنی با زدن تیک والد چایلدها هم تیک میخورن و با برداشتنش تیک اونها هم برداشته میشه ولی اگر دوبار کلیک بشه کار خراب میشه و این قضیه برعکس میشن
ممنون میشم اساتید عزیز مخصوصا استاد احمدی عزیز راهنمایی بفرمایند
متشکرم