你是不是只在第一次请求页面时,给 arrlistTypeName赋了值,以后就没有赋值给它了?
我记得静态变量好象不能保存到第二次请求。用session或者application吧

解决方案 »

  1.   

    去掉static仍然不行。这是原代码:
    <%@ Register TagPrefix="IE" Namespace="Microsoft.Web.UI.WebControls"
     Assembly="Microsoft.Web.UI.WebControls" %>
    <Script language="C#" runat="server">
    static DataSet dsArticleType;
    //是否包含CheckBox
    static string strCB;
    //是否包含在IFrame中
    static string strIsIFrame;
    //父窗口得到值的隐藏域
    static string strParentHidden;
    static string strNames="";
    static int intTempLen=0;
    //使用数组保存栏目层级
    static ArrayList arrlistTypeName;
    private void Page_Load(object sender, System.EventArgs e)
    {
    //arrlistTypeName.Clear();
    // TreeView1.Attributes.Add("onselectedindexchange","return TreeView1_AfterCheck()");
    strCB=Request.Params["cb"];
    if(strCB != null && strCB != "")
    {
    strCB = strCB.Trim();
    }
    else
    {
    strCB = "";
    }

    strIsIFrame=Request.Params["IsIFrame"];
    if(strIsIFrame != null && strIsIFrame != "")
    {
    strIsIFrame = strIsIFrame.Trim().ToLower();
    }
    else
    {
    strIsIFrame = "";
    } strParentHidden = Request.Params["ParentHidden"];
    if(strParentHidden != null && strParentHidden != "")
    {
    strParentHidden = strParentHidden.Trim();
    }
    else
    {
    strParentHidden = "";
    } if(!IsPostBack)
    {
    // arrlistTypeName=new ArrayList();
    try 
    {
    //初始化连接字符串
    dsArticleType = new DataSet();
    string strTable="ArticleType";
    string strSQL="Select * from ArticleType Order by OrderID";
    dsArticleType=CreateDataSet(strSQL,strConnString,strTable);
    }
    catch (Exception ex)
    {
    // Session["Error"] = ex.ToString();
    // Response.Redirect("error.aspx");       //跳转程序的公共错误处理页面
    }
    finally 
    {
    }
    //调用递归函数,完成树形结构的生成
    AddTree("0",(TreeNode)null);
    } string strBodyBgColor=Request.Params["BodyBgColor"];
    string strExpandLevel=Request.Params["ExpandLevel"];
    if(strBodyBgColor !=null && strBodyBgColor != "")
    {
    TreeViewBody.Attributes.Add("bgColor","#" + strBodyBgColor);
    TreeView1.Attributes.Add("DefaultStyle","color:#336699;font-size:13px");
    // TreeView1.Attributes.Add("DefaultStyle","background:#FF0000;border:solid 0px; color:yellow;font-size:8pt");
    // TreeView1.Attributes.Add("HoverStyle","color:yellow;font-name:Arial");
    // TreeView1.Attributes.Add("SelectedStyle","color:white;font-name:Arial;font-weight:bold-italic");
    }
    if(strExpandLevel !=null && strExpandLevel != "")
    {
    strExpandLevel=strExpandLevel.Trim();
    try
    {
    TreeView1.ExpandLevel=Convert.ToInt32(strExpandLevel);
    }
    catch(Exception ex)
    {
    TreeView1.ExpandLevel= 8;
    }
    }
    // TreeView1.ExpandAll();
    //arrlistTypeName.Clear();
    //arrlistTypeName=null;
    }// 递归添加树的节点
    public void AddTree(string ParentID,TreeNode pNode) 
    {
    DataView dvTree = new DataView(dsArticleType.Tables["ArticleType"]);
    //过滤ParentID,得到当前的所有子节点
    dvTree.RowFilter =  "[ParentId] = '" + ParentID + "'";
    int intTemp;
    foreach(DataRowView Row in dvTree) 
    {
    TreeNode Node=new TreeNode() ;
    if(pNode == null) 
    {    //'?添加根节点
    Node.Text = Row["TypeName"].ToString();
    Node.ID="0" + " | " + Row["ArticleTypeID"].ToString();
    // Node.CheckBox = true;
    TreeView1.Nodes.Add(Node);
       arrlistTypeName=new ArrayList();
    AddTree(Row["ArticleTypeID"].ToString(), Node);    //再次递归

    else 
    {   //添加当前节点的子节点
    Node.Text = Row["TypeName"].ToString();
    if(strCB == "true")
    {
    Node.CheckBox = true;
    }
    Node.ID=Row["TypeId"].ToString()+ " | " + Row["ArticleTypeID"].ToString(); if(Row["TypeID"].ToString().Length-intTempLen==2)
    {
    intTempLen=Row["TypeID"].ToString().Length;
    arrlistTypeName.Add(Row["TypeName"].ToString());
    }
    else if(Row["TypeID"].ToString().Length-intTempLen== 0)
    {
    intTempLen=Row["TypeID"].ToString().Length;
    arrlistTypeName.RemoveAt(arrlistTypeName.Count-1);
    arrlistTypeName.Add(Row["TypeName"].ToString());
    }
    else if(Row["TypeID"].ToString().Length-intTempLen<0)
    {
    intTemp=intTempLen-Row["TypeID"].ToString().Length;
    int k;
    for(k=0;k<intTemp;k+=2)
    {
    arrlistTypeName.RemoveAt(arrlistTypeName.Count-1-k);
    } arrlistTypeName.RemoveAt(arrlistTypeName.Count-1);
    arrlistTypeName.Add(Row["TypeName"].ToString());
    intTempLen=Row["TypeID"].ToString().Length;

    }
    int j;
    for(j=0;j<arrlistTypeName.Count;j++)
    {
    Node.ID += "-" + arrlistTypeName[j];
    } pNode.Nodes.Add(Node);
    AddTree(Row["ArticleTypeID"].ToString(),Node);     //再次递归
    }
    }
    } private void TreeView1_SelectedIndexChange(Object sender,TreeViewSelectEventArgs e)
    {
    TreeNode newNode = TreeView1.GetNodeFromIndex(e.NewNode);
    string strTmp;
    string strOutScript;
    string strOutTypeID;
    string strOutTypeScription="";
    string[]arrTmp;
    int m;
    if(strIsIFrame=="true" && strParentHidden == "singleTypeID")
    {
    strTmp= newNode.Text + "   ID=" + newNode.ID;
    // 要闻简讯   ID=10111210 | 15-即时新闻-国内新闻-国内要闻-要闻简讯
    arrTmp=strTmp.Split('-');
    strOutTypeID=arrTmp[0];
    for(m=1;m<arrTmp.Length;m++)
    {
    strOutTypeScription += "-" + arrTmp[m].ToString();
    }

    strOutScript=@"
    <Script language='JavaScript'>
    parent.document.all['singleTypeID'].value='"
    + strOutTypeID + "';"
    + @"parent.document.all['Add_ArticleTypeScription'].value='"
    + strOutTypeScription + "';"
    + @"
    </S cript>
    ";
    Response.Write(strOutScript.Replace("/S cript",@"/Script"));
    } newNode.Checked=true;
    CheckNodes(newNode);
    expand(newNode);
    }
    private void TreeView1_onCheck(object sender,TreeViewClickEventArgs e)
    {
    TreeNode newNode = TreeView1.GetNodeFromIndex(e.Node);
    //如果是选择单个TypeID,父窗口的隐含域为singleTypeID,则:
    CheckNodes(newNode);
    expand(newNode);
    }private void CheckNodes(TreeNode pNode)
    {
      foreach(TreeNode node in pNode.Nodes)
      {
        node.Checked = pNode.Checked;
        if(node.Nodes.Count > 0)
        {
           CheckNodes(node);
        }
      }
    CheckParentNodes(pNode);
    }//如果子节点任何一个或多个未被选中,则父节点不被选中
    private void CheckParentNodes(TreeNode cNode)
    {
      if(cNode.ID.Length>2)
      {
       if(!cNode.Checked)
    {
    ((TreeNode)cNode.Parent).Checked=false;
    TreeNode pNode = ((TreeNode)cNode.Parent);
    CheckParentNodes(pNode);
    }
      }
    }private void expand(TreeNode node)
    {
    if(node.Nodes.Count>0)
    {
    node.Expanded=true;
    foreach(TreeNode tempNode in node.Nodes)
    {
    expand(tempNode);
    }
    }
    }
    private void TreeView1_Expand(object sender,TreeViewClickEventArgs e)
    {
    }
    </Script>
    <Script language="JavaScript">
    function TreeView1_AfterCheck()
    {
    //alert("可以。");
    }
    </Script>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>新闻栏目分类</title>
    <style type="text/css">
    <!--
    body {
    margin-left: 2px;
    margin-top: 2px;
    }
    -->
    </style></head>
    <body runat="server" id="TreeViewBody">
    <form runat="server">
    <IE:TreeView id="TreeView1" runat="server" EXPANDLEVEL=2
     OnSelectedIndexChange="TreeView1_SelectedIndexChange"
     AutoPostBack="true" onexpand="TreeView1_Expand"
     oncheck="TreeView1_onCheck" 
     />
    </form>
    </body>
    </html>
      

  2.   

    是否与ArrayList的线程安全有关?
      

  3.   

    static ArrayList arrlistTypeName;
    Page_Load中:
    if(!IsPostBack)
    {
       AddTree("0",(TreeNode)null);
    }public void AddTree(string ParentID,TreeNode pNode) 
    {
    ...
    int intTemp;
    foreach(DataRowView Row in dvTree) 
    {
    ....
      //添加当前节点的子节点
    Node.Text = Row["TypeName"].ToString();
    if(strCB == "true")
    {
    Node.CheckBox = true;
    }
    Node.ID=Row["TypeId"].ToString()+ " | " + Row["ArticleTypeID"].ToString(); if(Row["TypeID"].ToString().Length-intTempLen==2)
    {
    intTempLen=Row["TypeID"].ToString().Length;
    arrlistTypeName.Add(Row["TypeName"].ToString());
    }
    else if(Row["TypeID"].ToString().Length-intTempLen== 0)
    {
    intTempLen=Row["TypeID"].ToString().Length;
    arrlistTypeName.RemoveAt(arrlistTypeName.Count-1);
    arrlistTypeName.Add(Row["TypeName"].ToString());
    }
    else if(Row["TypeID"].ToString().Length-intTempLen<0)
    {
    intTemp=intTempLen-Row["TypeID"].ToString().Length;
    int k;
    for(k=0;k<intTemp;k+=2)
    {
    //刷新时报下句错误:索引超出范围。必须为非负值并小于集合大小。参数名:index
    arrlistTypeName.RemoveAt(arrlistTypeName.Count-1-k);
    } arrlistTypeName.RemoveAt(arrlistTypeName.Count-1);
    arrlistTypeName.Add(Row["TypeName"].ToString());
    intTempLen=Row["TypeID"].ToString().Length;

    }
    ...
    pNode.Nodes.Add(Node);
    AddTree(Row["ArticleTypeID"].ToString(),Node);     //再次递归
    }

    }
      

  4.   

    你单步调试一下你的代码,看看
    arrlistTypeName.Add(Row["TypeName"].ToString());
    在你刷新时有没有执行。
    在执行RemoveAt前先看一下它的count为多少?
    然后在Remove前先判断一下它的count值,如果小于当胆要移除的项index值则不做移除操作
      

  5.   

    奇怪!刷新时arrlistTypeName.Add(Row["TypeName"].ToString());根本不执行。
      

  6.   

    问题出在intTempLen上,在Page_Load中的最后加上:arrlistTypeName=null;
    intTempLen=0;即可。谢谢 xupc(寻巢鸟)。