本文記錄的是帶領成員開發一個小模塊功能的時候,需要用到彈出窗口加載樹狀級聯單位選擇,最后決定用采用jQuery+EasyUI插件進行開發。但是在使用EasyUI中tree的插件時,碰到了不少麻煩。為了提供彈出樹的顯示速度,就采用異步加載數節點值,首先先加載根節點,然后根據點擊的節點展開加載子節點。
往往結果和預期的都不一樣,困惑了幾天,展開后子節點是動態加載了,但是收縮后無法清空之前填充的數據;第二次在展開時,子節點又被重復加載了一遍,造成了數據重復顯示,并沒有提供清除子節點的方法。想盡了各種辦法來解決這個問題,只能換另一種形式加載子節點的值了,把每一個節點值保存起來,判斷是否已經存在,存在就不在去加載。
兩種方法見實例:
頁面getTreeNode.ashx返回樹節點JSON格式數據:
public class getTreeNode : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        DataTable dt = (DataTable)context.Session["viewmaintain"];
        string parentId = string.Empty;
        string resultStr = string.Empty;
        string attributes = string.Empty;
        string colName = string.Empty;
        string sql = string.Empty;
        string Casname = string.Empty;
        bool colt = false;
        string icon = "icon-profile";
        if (!string.IsNullOrEmpty(context.Request.QueryString["pid"]))
        {
            parentId = context.Request.QueryString["pid"].ToString();
        }
        if ((!string.IsNullOrEmpty(context.Request.QueryString["coln"])) && (string.IsNullOrEmpty(context.Request.QueryString["casn"])))
        {
            colName = HttpUtility.UrlDecode(context.Request.QueryString["coln"].ToString()); 
            if (dt != null)
            {
                bool pt = true;
                while (pt)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        Casname = dt.Rows[i]["view_colname"].ToString();
                        if (dt.Rows[i]["view_colname"].ToString() == colName)
                        {
                            if (dt.Rows[i]["view_cas"].ToString() != null&&dt.Rows[i]["view_cas"].ToString() !="")
                            {
                                colName = dt.Rows[i]["view_cas"].ToString();
                            }
                            else
                            {
                                colt = true;
                                sql = dt.Rows[i]["view_sql"].ToString();
                                pt = false;
                            }
                            break;
                        }
                    }
                }
            }
        }
        if ((!string.IsNullOrEmpty(context.Request.QueryString["casn"])) && (!string.IsNullOrEmpty(context.Request.QueryString["coln"])))
        {
           string casnName = HttpUtility.UrlDecode(context.Request.QueryString["casn"].ToString());
           colName = HttpUtility.UrlDecode(context.Request.QueryString["coln"].ToString()); 
            if (dt != null)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Casname = dt.Rows[i]["view_colname"].ToString();
                    if (dt.Rows[i]["view_cas"].ToString() == casnName && casnName != colName)
                    {
                        colt = true;
                        sql = dt.Rows[i]["view_sql"].ToString();
                        break;
                    }
                }
            }
        }
        try
        {
            if (parentId != "" && colt == true)
            {
                //此處省略得到數據列表的代碼
                List<TreeInfo> ltree = DAL_TreeInfo.GetItemValue(parentId, sql);
                resultStr = "";
                resultStr += "[";
                if (ltree.Count > 0)
                {
                    foreach (TreeInfo item in ltree)
                    {
                        attributes = "";
                        attributes += "{/"cas/":/"" + Casname;
                        attributes += "/",/"val/":/"" + item._text + "/"}";
                        resultStr += "{";
                        resultStr += string.Format("/"id/": /"{0}/", /"text/": /"{1}/", /"iconCls/": /"{2}/", /"attributes/": {3}, /"state/": /"closed/"", item._id, item._text, icon, attributes);
                        resultStr += "},";
                    }
                    resultStr = resultStr.Substring(0, resultStr.Length - 1);
                }
                resultStr += "]";
            }
            else
            {
                resultStr = "[]";
            }
        }
        catch (Exception ex)
        {
            resultStr = "出錯";
        }
        context.Response.Write(resultStr);
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
小弟在此獻丑了,不知道各位專家、同仁有沒有遇到類似的問題,或者有其它更好的解決辦法,歡迎在這交流。
新聞熱點
疑難解答