选择子节点时,为什么我的节点会重复?

时间:2014-06-19 19:32:51

标签: asp.net events webforms treeview duplication

我的第二个ASP.NET问题。仍然经历着绳索......

因此,每次单击子节点时,根节点都会崩溃,并且根和子节点都会重复。我完全不知道为什么。这似乎发生在我目前正在使用的所有浏览器中(IE,Chrome和Firefox)。

选择子节点的动作。当我单击一个节点时,相邻div中的表将使用从SQL数据库获取的信息进行更新。

网站非常粗糙......在让它看起来漂亮之前,尝试学习ASP.NET和Webforms内部。

图片一 - 我打开了一个根节点,即将选择一个孩子。

enter image description here

图片二 - 我选择了一个子节点。根节点已折叠(?)并已重复。

enter image description here

图片三 - 我重新打开一个根节点,孩子们都重复了。 enter image description here

后台C#代码:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace LocalTest
{
    public partial class WebForm1 : System.Web.UI.Page
    {

        //Setup connection string.
        SqlConnection conn;
        SqlDataReader reader = null;


        protected void Page_Load(object sender, EventArgs e)
        {
            //Table1.Visible = false;
            conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString);

            //Initial treeview setup.
            TreeInit();

            //Initial table setup
            TableInit();

            try
            {
                //Open connection and set up reader.
                conn.Open();

                SqlCommand cmd = new SqlCommand("select BatchNumber, Area from tblBatch;", conn);

                reader = cmd.ExecuteReader();

                while(reader.Read())
                {
                    //Fill up each nodes with respective Batch Numbers.
                    if(reader["Area"].ToString().Equals("N"))
                    {
                        TreeNode aNode = new TreeNode(reader["BatchNumber"].ToString());
                        aNode.SelectAction = TreeNodeSelectAction.Select;
                        TreeView1.Nodes[0].ChildNodes.Add(aNode);
                    }
                    else
                    {
                        TreeNode aNode = new TreeNode(reader["BatchNumber"].ToString());
                        aNode.SelectAction = TreeNodeSelectAction.Select;
                        TreeView1.Nodes[1].ChildNodes.Add(aNode);
                    }
                }

                conn.Close();

                TreeView1.CollapseAll();

            }
            catch (Exception er)
            {

            }

        }

        protected void Chart1_Load(object sender, EventArgs e)
        {

        }

        protected void Chart1_Load1(object sender, EventArgs e)
        {

        }

        protected void OnSelectNode(object sender, EventArgs e)
        {
            //Response.Write(TreeView1.SelectedNode.Text);
            string batchNumber = TreeView1.SelectedNode.Text;
            Response.Write(batchNumber);//Debugging

            conn.Open();
            SqlCommand cmd = new SqlCommand("select * from tblTemp where BatchId = (select Id from tblBatch where BatchNumber = " + batchNumber + ")", conn);
            reader = cmd.ExecuteReader();


            while(reader.Read())
            {
                TableRow aRow = new TableRow();

                for (int i = 0; i < 5; i++)
                {
                    TableCell aCell = new TableCell();
                    aCell.Text = reader[i].ToString();
                    aRow.Cells.Add(aCell);                    
                }
                Table1.Rows.Add(aRow);
            }

            conn.Close();

            //Table1.Visible = true;

        }

        protected void TableInit()
        {
            TableRow headerRow = new TableRow();
            TableCell headerCell1 = new TableCell();
            TableCell headerCell2 = new TableCell();
            TableCell headerCell3 = new TableCell();
            TableCell headerCell4 = new TableCell();
            TableCell headerCell5 = new TableCell();

            headerCell1.Text = "Id";
            headerCell2.Text = "BatchId";
            headerCell3.Text = "Temp1";
            headerCell4.Text = "Temp2";
            headerCell5.Text = "Seq No.";

            headerRow.Cells.Add(headerCell1);
            headerRow.Cells.Add(headerCell2);
            headerRow.Cells.Add(headerCell3);
            headerRow.Cells.Add(headerCell4);
            headerRow.Cells.Add(headerCell5);

            Table1.Rows.Add(headerRow);
        }

        protected void TreeInit()
        {
            //Create nodes.
            TreeNode nordonNode = new TreeNode("Nordon");
            TreeNode bobyNode = new TreeNode("Boby");

            //Set select action to expand. Not doing this resulting in duplication of nodes.
            nordonNode.SelectAction = TreeNodeSelectAction.Expand;
            bobyNode.SelectAction = TreeNodeSelectAction.Expand;

            //Add nodes to treeview.
            TreeView1.Nodes.Add(nordonNode);
            TreeView1.Nodes.Add(bobyNode);
        }


    }
}

WebForm HTML / ASP:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="LocalTest.WebForm1" %>

<%@ Register assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" namespace="System.Web.UI.DataVisualization.Charting" tagprefix="asp" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Cast Records</title>
    <link rel="stylesheet" type="text/css" href="CSS/StyleSheet.css"/>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyConnection %>" ></asp:SqlDataSource>
        <!--SelectCommand="SELECT * FROM [People]"-->
    </div>
    <!-- header for the page -->
    <div id="header">

    </div>

    <!-- tree view div -->
    <div id="treeViewDiv">
        <asp:TreeView ID="TreeView1" runat="server" Height="571px" ShowLines="True" Width="135px" OnSelectedNodeChanged="OnSelectNode" style="position: relative">
        </asp:TreeView>
    </div>

    <!-- table div -->
    <div id="tableDiv">
        <asp:Table ID="Table1" runat="server" Height="96px" Width="459px" style="z-index: 1; left: 343px; top: 238px; position: relative; height: 96px; width: 459px" BackColor="#99CCFF" BorderColor="#FFFF99" BorderStyle="Solid" BorderWidth="2px" GridLines="Both">
        </asp:Table>
    </div>
    </form>
</body>
</html>

样式表:

body {
}

#header{
    width: 100%;
    height:100px;
    background-color: #66FFFF;

}

#treeViewDiv{
    float:left;
    width: 30%;
    height: 500px;
    background-color: #ff6a00;
    overflow: auto;
}

#tableDiv{    
    float: right;
    width:70%;
    height:500px;
    background-color: #00ff21;
}

编辑:生命周期和(!IsPostBack)。疑难杂症!非常感谢你们。我用(!IsPostBack)包含代码,它在某些地方帮助了,并在其他地方引起了问题。我知道现在去哪儿。感谢您的回复。

2 个答案:

答案 0 :(得分:3)

您可能希望将Page_Load中的初始化代码包装在if (!IsPostback) {}

还要阅读一下页面的生命周期和视图状态,以了解重复发生的原因。

答案 1 :(得分:1)

考虑到你的描述,执行的代码Page_Load被执行多次,即创建根节点,将子项从数据库附加到索引0和1的根,即重复的条目!

我不是100%肯定,但是调用SelectedNodeChanged不仅会触发你的OnSelectNode,还会导致Post_Back到服务器,导致Page_Load再次被执行!

请参阅以下(不幸的)德语页面的以下行:http://www.aspheute.com/artikel/20000922.htm

  

Die Anweisungen innerhalb dieser Eventroutine werden bei jedem Seitenaufruf,bzw。 PostBackausgeführt。

翻译:“此事件例程(= Page_Load)中的语句在每个页面请求或PostBack上执行。”

这意味着,在每个事件上,将导致asp.net功能在服务器的SAVED状态上执行,将导致回发,从而再次执行Page_Load。

因此,您可以考虑将初始化/创建代码移动到if-block中,如下所示:

if(!Page.IsPostBack)
{ // This page is loaded the fist time, i.e. no postback event due to selections
// Code...
}

我希望这能解决您的问题和帮助。

问候,Marc