裝X未果,不慎陷入遞歸迷局

Winform程序,我想要獲得頁面上某個控件的路徑,比如Form.panel1.panel2.label,然後寫了一個遞歸調用
如下所示

public static string GetControlParents(Control control, string parentName) 
        { 
            Control parentControl = control.Parent;
            if (parentControl != null)
                parentName = parentControl.Name + "." + parentName;
            if (parentControl.Parent != null)
                GetControlParents(parentControl, parentName); 
            return parentName.Trim('.');
        }

string path = PublicFunction.GetControlParents(control, “”);
像這樣直接調用就行了,但是問題來了,我每次調用的時候總是隻能得到一個父控件的名稱
在最終的調試過程中發現了問題,按F11單步調試,在代碼最後return的時候出現了問題,每次return都會再次返回到遞歸方法裏面,好像又返回了

解決如下

public static string GetControlParents(Control control, string parentName) 
        { 
            Control parentControl = control.Parent;
            if (parentControl != null)
                parentName = parentControl.Name + "." + parentName;
            if (parentControl.Parent != null)
                parentName = GetControlParents(parentControl, parentName); 
            return parentName.Trim('.');
        }

原來是沒有把每次執行的返回值拿出來,導致它在返回的時候反向順序return,最終回到了第一次的調用。

技術不到家,遞歸要慎用
下面給出一個簡單的方法

public static string GetControlParents(Control control)
        {
            string sParent = "";
            while (control.Parent != null)
            {
                sParent = control.Parent.Name + "." + sParent;
                control = control.Parent;
            }
            sParent = sParent.Trim('.'); 
            return sParent;
        }
發佈了33 篇原創文章 · 獲贊 38 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章