none
Несколько вопросов по созданию web интерфейса RRS feed

  • Вопрос

  • Здравствуйте! Помогите определиться с технологией. На C# только учусь писать, c ASP  та же история, поэтому заранее прошу прощения за, возможно глупые, вопросы!!!!!

    Задача: На Web странице есть TreeView данные в который выгружаются динамически из бд (порядка полутора тысяч объектов). Дерево выстраивается в зависимости от того какой элемент выбран в DropDownList, данные в который грузятся так же из бд. Это пока всё что я написала:

    sing System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Drawing.Design;
    using System.Workflow.ComponentModel;
    using System.Net;
    
    public partial class _Default : System.Web.UI.Page
    {
      protected void Page_Load(object sender, EventArgs e)
      {
        
      }
    
    
      protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
      {
        // lableStatus.Text = "ты выбрал: " + TreeView1.SelectedNode.Text;
      }
    
      protected void TreeView1_TreeNodePopulate(object sender, System.Web.UI.WebControls.TreeNodeEventArgs e)  //вывов соответствующих методов для заполнения узлов на определённом уровне
      {
        if (e.Node.ChildNodes.Count == 0)
        {
    
          switch (e.Node.Depth)
          {
            case 0:
              PopulateCategories(e.Node);   
              break;
            case 1:
              PopulateProducts(e.Node);    
              break;
            case 2:
              PopulateProducts_TreeLayer(e.Node);  
              break;
            case 3:
              PopulateProducts_TreeNextLayer(e.Node);  
              break;
            case 4:
              PopulateProducts_TreeNextLayer_1(e.Node);  
              break;
            case 5:
              PopulateProducts_TreeNextLayer_2(e.Node);  
              break;
            case 6:
              PopulateProducts_TreeNextLayer_3(e.Node);   
              break;
          }
        }
      }
    
    
      private DataSet RunQuery(SqlCommand sqlQuery) 
      {
        string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection DBConnection = new SqlConnection(connectionString);
        SqlDataAdapter dbAdapter = new SqlDataAdapter();
        dbAdapter.SelectCommand = sqlQuery;
        sqlQuery.Connection = DBConnection;
        DataSet resultsDataSet = new DataSet();
        try
        {
          dbAdapter.Fill(resultsDataSet);
        }
        catch
        {
          lableStatus.Text = "Unable to connect to SQL Server";
        }
        return resultsDataSet;
      }
    
    
    
    
      void PopulateProducts_TreeNextLayer_3(TreeNode node) 
      {
        string parentID3 = node.Value.Trim();
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "SELECT ........ = '" + parentID3 + "'";
        DataSet ResultSet = RunQuery(sqlQuery);
    
    
        foreach (DataRow row in ResultSet.Tables[0].Rows)
        {
          TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
          NewNode.PopulateOnDemand = true;
          NewNode.SelectAction = TreeNodeSelectAction.Select;
          node.ChildNodes.Add(NewNode);
        }
    
      }
    
    
    
    
      void PopulateProducts_TreeNextLayer_2(TreeNode node) 
      {
        string parentID2 = node.Value.Trim();
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "SELECT ....... = '" + parentID2 + "'";
        DataSet ResultSet = RunQuery(sqlQuery);
    
        
        foreach (DataRow row in ResultSet.Tables[0].Rows)
        {
          TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
          NewNode.PopulateOnDemand = true;
          NewNode.SelectAction = TreeNodeSelectAction.Select;
          node.ChildNodes.Add(NewNode);
        }
    
      }
    
      void PopulateProducts_TreeNextLayer_1(TreeNode node) 
      {
        string parentID1 = node.Value.Trim();
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "SELECT ....... = '" + parentID1 + "'";
        DataSet ResultSet = RunQuery(sqlQuery);
    
         foreach (DataRow row in ResultSet.Tables[0].Rows)
        {
          TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
          NewNode.PopulateOnDemand = true;
          NewNode.SelectAction = TreeNodeSelectAction.Select;
          node.ChildNodes.Add(NewNode);
        }
       
      }
    
    
    
    
    
      void PopulateProducts_TreeNextLayer(TreeNode node) // класс построения четвёртого уровня дерева
      {
        string parentID = node.Value.Trim();
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "SELECT .......... = '" + parentID + "'";
        DataSet ResultSet = RunQuery(sqlQuery);
    
        foreach (DataRow row in ResultSet.Tables[0].Rows)
        {
          TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
          NewNode.PopulateOnDemand = true;
          NewNode.SelectAction = TreeNodeSelectAction.Select;
          node.ChildNodes.Add(NewNode);
        }
      }
    
    
    
    
    
      void PopulateProducts_TreeLayer(TreeNode node) 
      {
        string parextID = node.Value.Trim();
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "SELECT ............ = '" + parextID + "'"; 
        DataSet ResultSet = RunQuery(sqlQuery);
    
        foreach (DataRow row in ResultSet.Tables[0].Rows)
        {
          TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
          NewNode.PopulateOnDemand = true;
          NewNode.SelectAction = TreeNodeSelectAction.Select;
          node.ChildNodes.Add(NewNode);
        }
      }
    
    
    
    
      void PopulateProducts(TreeNode node) 
      {
        string parID = node.Value.Trim();
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "SELECT .............. = '" + parID + "'";
        DataSet ResultSet = RunQuery(sqlQuery);
    
        foreach (DataRow row in ResultSet.Tables[0].Rows)
        {
          TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1731"].ToString(), row["ID"].ToString());
          NewNode.PopulateOnDemand = true;
          NewNode.SelectAction = TreeNodeSelectAction.Select;
          node.ChildNodes.Add(NewNode);
    
        }
      }
    
    
    
    
      void PopulateCategories(TreeNode node)  
      {
        string value_Item = DropDownList1.SelectedValue.Trim();
        SqlCommand sqlQuery = new SqlCommand("SELECT ........... = '" + value_Item + "'");
        DataSet resultSet;
        resultSet = RunQuery(sqlQuery);
        if (resultSet.Tables.Count > 0)  
        {
          foreach (DataRow row in resultSet.Tables[0].Rows)  
          {
            TreeNode NewNode = new TreeNode(row["SP1731"].ToString(), row["ID"].ToString());
            NewNode.ImageUrl = "http://...";
            NewNode.PopulateOnDemand = true;  
            NewNode.SelectAction = TreeNodeSelectAction.Select; 
            node.ChildNodes.Add(NewNode); 
          }
        }
      }
      protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
      {
    
      }
    protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)
    {
    
    }
    }
    

    Теперь непосредственно в чём проблемы:

    1) При каждом изменении в DropDownList перестраивать дерево(на данный момент оно 2 раза перестраивает дерево, а на третий уже построенное дерево просто не меняется, не понимаю почему)

    2) Как правильно выводить сообщение-предупреждение пользователю, дорустим о том что что сначала неоюходимо выбрать элемент в  DropDownList? (MessegeDox-не работает, это WindowsForms, alert-тоже, это javascript? не понимаю)

    3) Необходимо реализовать поиск объектов в дереве, с раскрытием необходимого узла дерева автоматически! Как? ведь оно грузится динамически? это вообще возможно реализовать? Если можно подскажите как лучше организовать этот поиск.

    4) Ещё хотелось бы рядом с каждым treenode разместить нечто типа imegebutton, либо всплывающего меню, цель которого открыть открыть новую страницу, на которой в textbox отобразится имя выбранного в дереве обьекта, ну и парочку таблиц с информацией по данному объекту, в общем выполнить межстраничную передачу данных, но чтоб новая страница открывалась в новой вкладке или новом окне IE.

    Вопросов много, но мне бы хотябы направление выбрать, я излазила весь msdn, то что нужно найти не могу, мозг кипит, а время идёт!

    Заранее благодарна!

    25 августа 2010 г. 4:37

Ответы

  • Каким образом при поиске автоматически найти и раскрать тот узел в котором находится элемент, необходимый пользователю, если он находится допустим в 5ом уровне.

     

    Найденный узел можно раскрыть так:

    Treeview1.FindNode("Founded_node").Expand( );

     

     

    Я бы на вашем месте весь проект заменил на asp.net MVC и использовал отдельный репозитарий для управления данный(судя по вашему проекту, там достаточно сложная структура данных)

    .

    • Помечено в качестве ответа I.Vorontsov 30 августа 2010 г. 6:23
    27 августа 2010 г. 16:40

Все ответы

  • 1. Сложно судить, если у вы не привели полный код вашего проекта, но возможно, что результат 3-го раза совпадает со 2-м

    Для этого проекта я бы использовал asp.net MVC, чтобы разделить управление данными и их представление в различном виде(в т. ч. и иерархическом, как у вас).

    Или по крайней мере не использовал динамический sql без параметров.

    2. Для этого есть группы компонентов Validation. Для проверки наличия значения у компонента используется компонент RequiredFieldValidator

    3. для раскрытия узла у TreeViewNode есть метод Expand()

    4. Для реализации всплывающих меню нужно использовать AjaxControlToolkit или JQuery

     

    26 августа 2010 г. 4:10
  • 1. Вот код страницы aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
      <title>Электронный архив проектно-сметной документации"</title>
    <script language="javascript" type="text/javascript">
    // <!CDATA[// ]]>
    </script>
    </head>
    <body style="background-color: white" >
      <form id="form1" runat="server">
      <div>
        <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged"
          
          Style="border: thick double silver; overflow: auto; left: 17px; position: absolute; top: 287px; color: white; font-family: 'Times New Roman'; font-weight: bold; width: 1217px; height: 453px;" 
          ExpandDepth="15" OnTreeNodePopulate="TreeView1_TreeNodePopulate" 
          MaxDataBindDepth="15" ShowLines="True" CollapseImageToolTip="Свернуть" 
          ExpandImageToolTip="Развернуть">
          <Nodes>
           <asp:TreeNode Text="Объекты Строительства" Value="New Node" 
              PopulateOnDemand="True" ToolTip="Отобразить" Expanded="False" Checked="True"></asp:TreeNode>
          </Nodes>
          <RootNodeStyle ForeColor="Black" />
          <LeafNodeStyle ForeColor="DarkBlue" />
          <ParentNodeStyle ForeColor="DarkBlue" />
          <SelectedNodeStyle ForeColor="Purple" />
        </asp:TreeView>
        <asp:Panel ID="Panel1" runat="server" Height="102px" Width="1223px">
          <asp:Label ID="lableStatus" runat="server" Font-Size="X-Large" 
            Style="font-weight: bold;
            left: 292px; font-style: italic; position: absolute; top: 23px;
            text-align: center; font-variant: normal; text-decoration: underline; color: #000099; height: 89px;" Text='Электронный архив проектно-сметной документации по обьектам строительства"'
            Width="522px"></asp:Label>
          <asp:Image ID="Image1" runat="server" ImageUrl="http://localhost/Logotip.gif" />
          <asp:Image ID="Image2" runat="server" ImageUrl="http://localhost/xant.gif" Style="left: 864px; position: absolute; top: 19px"
            Width="393px" Height="103px" />
        </asp:Panel>
        <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
        <hr style="left: 13px; color: #000000; position: absolute; top: 122px" />
       </div>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DataBazePlaningConnectionString %>"
          SelectCommand="SELECT SC1730.ID, SC1730.PARENTID, SC1730.SP1731, SC1737.ID, SC1737.PARENTID, SC1737.PARENTEXT, SC1737.SP1738, SC1737.ISFOLDER FROM SC1730 INNER JOIN SC1737 ON RTRIM(LTRIM(SC1730.ID))=RTRIM(LTRIM(SC1737.PARENTEXT))">
        </asp:SqlDataSource>
      <asp:DropDownList ID="DropDownList1" 
        Style ="position:absolute; top: 221px; left: 18px; height: 12px; width: 636px;" 
        runat="server" onselectedindexchanged="DropDownList1_SelectedIndexChanged" 
        AutoPostBack="True" DataSourceID="SqlDataSource2" DataTextField="SP1731" 
        DataValueField="ID" Font-Bold="True" AppendDataBoundItems="True">
        <asp:ListItem></asp:ListItem>
      </asp:DropDownList>
      <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
        ConnectionString="<%$ ConnectionStrings:DataBazePlaning_ConnectionString2 %>" 
        
        SelectCommand="SELECT SP1731, CODE, ID, PARENTID FROM SC1730 WHERE LTRIM(PARENTID) != '0' ORDER BY ID">
      </asp:SqlDataSource>
      <asp:CheckBox ID="CheckBox1" 
        Style ="position:absolute; top: 257px; left: 19px; width: 277px;" 
        runat="server" Text="Отображать объекты без кода" />
      <asp:Label ID="Label2" 
        Style ="position:absolute; top: 192px; left: 24px; width: 456px;" 
        runat="server" Text="Выберите стройку"></asp:Label>
      <asp:Button ID="Button3" 
        Style ="position:absolute; top: 778px; left: 416px; width: 417px; height: 41px;" 
        runat="server" Text="Открыть проектно-сметную документацию по объекту" 
        Font-Bold="True" />
      </form>
    </body>
    </html>

    по поводу совпадений, их нет, и это точно!

    по пункту 1, пошаговая отладка даёт результат алгоритма такой:
    1) protected void Page_Load(object sender, EventArgs e)
    загрузилась страница
    выбрали объект в DropDownList1
    2) protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)
    загрузилась страница
    выбрали TreeView1
    3) protected void Page_Load(object sender, EventArgs e)
    4) protected void TreeView1_TreeNodePopulate(object sender, System.Web.UI.WebControls.TreeNodeEventArgs e)
    загрузилась страница с раскрытым первым уровнем дерева
    Далее
    в DropDownList1 меняем объект
    1) protected void TreeView1_TreeNodePopulate(object sender, System.Web.UI.WebControls.TreeNodeEventArgs e)
    2) protected void Page_Load(object sender, EventArgs e)
    3) protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)
    загрузилась страница с раскрытым первым уровнем дерева соответсвенно изменённому объекту в DropDownList1

    Снова Меняю объект в DropDownList1
    1) protected void Page_Load(object sender, EventArgs e)
    2) protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)
     подгрузилась форма где дерево не изменилось, а должно было перестроиться!!!!!

    3. Про Expend() я в курсе. Выбрал пользователь объект в DropDownList дерево ещё не построиось, тыкнул на элемент TreeView, выстроился первый уровень, а не всё дерево сразу, т.е. все делается на сервере при очередном постбеке, который происходит по каждому чиху. Каким образом при поиске автоматически найти и раскрать тот узел в котором находится элемент, необходимый пользователю, если он находится допустим в 5ом уровне.

     

    26 августа 2010 г. 6:06
  • Каким образом при поиске автоматически найти и раскрать тот узел в котором находится элемент, необходимый пользователю, если он находится допустим в 5ом уровне.

     

    Найденный узел можно раскрыть так:

    Treeview1.FindNode("Founded_node").Expand( );

     

     

    Я бы на вашем месте весь проект заменил на asp.net MVC и использовал отдельный репозитарий для управления данный(судя по вашему проекту, там достаточно сложная структура данных)

    .

    • Помечено в качестве ответа I.Vorontsov 30 августа 2010 г. 6:23
    27 августа 2010 г. 16:40