prans_tork
دوشنبه 25 خرداد 1394, 19:12 عصر
با سلام
من برای طراحی یک سطح دسترسی پویا لازم دارم که تمام کنترل هایی که فیلد Tag مقداری دارن رو لیست کنم روی همه فرم ها ( روی یک فرم مخصوص این کار)
هر فرمی داخلش یک کنترل LayoutContol داره و هر LayoutControl داخلش یک LayoutControlItem و هر LayoutControlItem داخلش یک پنل و کنترل های اصلی مثل دکمه ها و تکست باکس ها داخل اونها قرار دارن. یه چیزی مثل شکل زیر:
132261
نکته: در این حالت داخل فرم فقط یک کنترل (LayoutContol ) وجود داره
داخل LayoutContol هم فقط یک کنترل (LayoutControlItem ) وجود داره و ....
حاالا با یک رابطه بازگشتی اومدم و گفتم اگر چیزی داخل کنترل بود بازم تابع پیدا کردن کنترل هارو صدا بزن.
همه چیز در ظاهر و منطقاً درسته
اما
مشکل اینه که گیر StackOverFlow Exception می افتم.
راه حلی داره؟
if (!string.Equals(f.Name, "FrmAccessControl"))
{
AddNodeForControl(treeNode, f.Controls);
}
....
private void AddNodeForControl(DevComponents.AdvTree.Node MainNode, Control.ControlCollection HasChildControl)
{
foreach (Control childItem in HasChildControl)
{
if (childItem.Controls.Count != 0)
{
AddNodeForControl(MainNode, childItem.Controls);
}
DevComponents.AdvTree.Node CHildNode;
byte CSControlD = AccessControlClass.Val<byte>(childItem.Tag);
if (CSControlD > 5)
{
string ControlText = childItem.Text;
CHildNode = new DevComponents.AdvTree.Node();
CHildNode.DragDropEnabled = false;
CHildNode.Name = childItem.Name + "Node";
if (!string.IsNullOrEmpty(childItem.Text))
{
CHildNode.Text = ControlText;
}
else
{
CHildNode.Text = childItem.Name;
}
//CHildNode.Text = ControlText;
CHildNode.Style = DevComponents.AdvTree.NodeStyles.BlueLight;
CHildNode.Style.PaddingRight = 50;
CHildNode.Style.MarginBottom = 2;
CHildNode.CheckBoxVisible = true;
CHildNode.ExpandVisibility = DevComponents.AdvTree.eNodeExpandVisibility.Hidden ;
MainNode.Nodes.Add(CHildNode);
}
}
من برای طراحی یک سطح دسترسی پویا لازم دارم که تمام کنترل هایی که فیلد Tag مقداری دارن رو لیست کنم روی همه فرم ها ( روی یک فرم مخصوص این کار)
هر فرمی داخلش یک کنترل LayoutContol داره و هر LayoutControl داخلش یک LayoutControlItem و هر LayoutControlItem داخلش یک پنل و کنترل های اصلی مثل دکمه ها و تکست باکس ها داخل اونها قرار دارن. یه چیزی مثل شکل زیر:
132261
نکته: در این حالت داخل فرم فقط یک کنترل (LayoutContol ) وجود داره
داخل LayoutContol هم فقط یک کنترل (LayoutControlItem ) وجود داره و ....
حاالا با یک رابطه بازگشتی اومدم و گفتم اگر چیزی داخل کنترل بود بازم تابع پیدا کردن کنترل هارو صدا بزن.
همه چیز در ظاهر و منطقاً درسته
اما
مشکل اینه که گیر StackOverFlow Exception می افتم.
راه حلی داره؟
if (!string.Equals(f.Name, "FrmAccessControl"))
{
AddNodeForControl(treeNode, f.Controls);
}
....
private void AddNodeForControl(DevComponents.AdvTree.Node MainNode, Control.ControlCollection HasChildControl)
{
foreach (Control childItem in HasChildControl)
{
if (childItem.Controls.Count != 0)
{
AddNodeForControl(MainNode, childItem.Controls);
}
DevComponents.AdvTree.Node CHildNode;
byte CSControlD = AccessControlClass.Val<byte>(childItem.Tag);
if (CSControlD > 5)
{
string ControlText = childItem.Text;
CHildNode = new DevComponents.AdvTree.Node();
CHildNode.DragDropEnabled = false;
CHildNode.Name = childItem.Name + "Node";
if (!string.IsNullOrEmpty(childItem.Text))
{
CHildNode.Text = ControlText;
}
else
{
CHildNode.Text = childItem.Name;
}
//CHildNode.Text = ControlText;
CHildNode.Style = DevComponents.AdvTree.NodeStyles.BlueLight;
CHildNode.Style.PaddingRight = 50;
CHildNode.Style.MarginBottom = 2;
CHildNode.CheckBoxVisible = true;
CHildNode.ExpandVisibility = DevComponents.AdvTree.eNodeExpandVisibility.Hidden ;
MainNode.Nodes.Add(CHildNode);
}
}