Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Несколько вопросов по технологии создания корпоративного web интерфейса  (Прочитано 58219 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sav-ledi
Участник

ru
Offline Offline

« : 25-08-2010 06:14 » 

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

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

Код:
using 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;


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.
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #1 : 25-08-2010 07:04 » 

по пункту 1 - что говорит отладчик?

по пункту 2... например так, на клиенте должно быть

<script type="text/javascript">
function show_alert()
{
  alert("I am an alert box!");
}
</script>

<input type="button" onclick="show_alert()" value="Show alert box" />

как вариант, можно сообщение сформировать на сервере и прислать страницу с нужным сообщением.

пункт 3 - что значит грузится динамически (как ты это понимаешь?). Решать проблему можно как на клиенте, так и на сервере - вопрос - а как надо?

пункт 4 - опять таки, как надо решать проблему на сервере или на клиенте?
Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #2 : 25-08-2010 08:11 » 

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

Добавлено через 29 минут и 45 секунд:
по пункту 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)
 подгрузилась форма где дерево не изменилось, а должно было перестроиться!!!!!
« Последнее редактирование: 25-08-2010 08:41 от sav-ledi » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #3 : 25-08-2010 12:52 » 

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

Цитата
Далее
в 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

1. Не понял почему при изменении DropDownList1 первым на сервере идет вызов TreeView1_TreeNodePopulate? Что происходит при вызове?
2. Ты уверена, что у тебя каждый раз грузится одна и таже страница.
3. Что написано в обработчике DropDownList1_SelectIndexChange (есть ли тут вызов перестроения дерева)?

Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #4 : 25-08-2010 14:52 » 

Нет! я же привела код, в обработчике protected void DropDownList1_SelectIndexChange(object sender, EventArgs e) абсолютно пусто.
Если на первом шаге выстроить 3 уровня дерева, а потом на втором изменить объект в DropDownList, то о в дереве сразу же отобразиться автоматом 3 уровня, соответственно выбранному объекту, почему так, не знаю... а при третьем выборе нового объекта в DropDownList вообще ничего не меняется, дерево остаётся в том же состоянии что и на втором шаге, почему так, опять же не понимаю.

Добавлено через 4 минуты и 24 секунды:
Цитата
2. Ты уверена, что у тебя каждый раз грузится одна и таже страница.
Она у меня всего одна, Я  уверена что грузится одна и та же страница.
« Последнее редактирование: 25-08-2010 14:56 от sav-ledi » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #5 : 25-08-2010 15:57 » 

я со стандартным деревом не работал, но чего-то не хватает. Ты не используешь ajax из библиотеки майкрософта? Выложи aspx файл этой страницы.

А вообще из кода мне не понятно следующее:
1. Кто и когда строит дерево (Page_Load ничего не делает)?
2. Как дерево зависит от значения DropDown контрола (обработчик DropDownList1_SelectIndexChange пустой)? Это как раз вопрос - с чего это дерево вообще должно меняться? Где зависимость открытой ноды дерева от текущего значения DropDownList1?
3. Почему при втором изменении значения DropDown контрола идет вызов TreeView1_TreeNodePopulate

Если можешь выложить проект выкладывай (БД не нужна только код).
Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #6 : 26-08-2010 02:52 » 

Выложи 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>


2. Как дерево зависит от значения DropDown контрола (обработчик DropDownList1_SelectIndexChange пустой)? Это как раз вопрос - с чего это дерево вообще должно меняться? Где зависимость открытой ноды дерева от текущего значения DropDownList1?
Вот зависимость
 void PopulateCategories(TreeNode node)   
    {
       string value_Item = DropDownList1.SelectedValue.Trim();
        SqlCommand sqlQuery = new SqlCommand("SELECT ........... = '" + value_Item + "'");
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 26-08-2010 08:42 » 

Цитата: sav-ledi
3) Необходимо реализовать поиск объектов в дереве, с раскрытием необходимого узла дерева автоматически! Как? ведь оно грузится динамически? это вообще возможно реализовать?
У тебя дерево имеет строго 3 уровня вложенности? Исходя из того, что каждый уровень заполняется отдельной процедурой, похоже это так...

Поиск реализуется в базе данных. Однако нужно получить не только найденный элемент, но и его "родителей" выше по дереву. Полученную таблицу упорядочить по глубине вложенности элементов и пройти строчка за строчкой, позиционируя выделение на очередном элементе, загружая список вложенных элементов, затем в них выделять следующий и т.д. - до последнего, у которого уже нет вложенных.

Цитата: sav-ledi
1) При каждом изменении в DropDownList перестраивать дерево(на данный момент оно 2 раза перестраивает дерево, а на третий уже построенное дерево просто не меняется, не понимаю почему)
Не очень понятно. При каждом клике текущая ветка дерева должна перестраиваться? При каждом клике текущий элемент должен перестраиваться, и для него загружаться список вложенных элементов? При каждом клике должны перестраиваться все ранее загруженные данные?

При выборе нового элемента, другие (уже не используемые) ветви должны автоматически сворачиваться и очищаться?


Наконец, дерево размещается в форме, которую изредка открывают, делают одно-два действия и уходят на другую форму или закрывают приложение. Или же это форма, с которой работают весь день, и она постоянно висит у пользователя? В последнем случае проще загрузить всё дерево сразу, а не грузить по веткам, поскольку после длительного использования, возможно, все ветки будут подгружены. 1,5 тыс. элементов для 3-хуровневого дерева - это не так много.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
sav-ledi
Участник

ru
Offline Offline

« Ответ #8 : 26-08-2010 10:00 » 

У тебя дерево имеет строго 3 уровня вложенности?
Нет, уровней вложенности порядка 10ти


Не очень понятно. При каждом клике текущая ветка дерева должна перестраиваться? При каждом клике текущий элемент должен перестраиваться, и для него загружаться список вложенных элементов? При каждом клике должны перестраиваться все ранее загруженные данные?

При выборе нового элемента, другие (уже не используемые) ветви должны автоматически сворачиваться и очищаться?


Дерево должно перестроиться абсолютно полностью, начиная с первого же узла, при каждом изменении объекта в элеменьте DropDownList. Дважды это проиходит, при третьем изменении не происходит ничего!

Наконец, дерево размещается в форме, которую изредка открывают, делают одно-два действия и уходят на другую форму или закрывают приложение. Или же это форма, с которой работают весь день, и она постоянно висит у пользователя? В последнем случае проще загрузить всё дерево сразу, а не грузить по веткам, поскольку после длительного использования, возможно, все ветки будут подгружены. 1,5 тыс. элементов для 3-хуровневого дерева - это не так много.
Дерево сильно разрастается, и динамическая загрузка это требование ночальства
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #9 : 26-08-2010 11:31 » 

хммммм
все данные что ты дала никак не объясняют этого
Цитата
3. Почему при втором изменении значения DropDown контрола идет вызов TreeView1_TreeNodePopulate
и этого
Цитата
Снова Меняю объект в DropDownList1
1) protected void Page_Load(object sender, EventArgs e)
2) protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)
при изменении DropDownList1 на сервере сначала должна отрабатывать DropDownList1_SelectIndexChange, а только потом Page_Load

теоретически дерево может не перестраиваться из-за данных (т.е. при изменении значения в DropDownList1 данные получаются такими, что запрос на обновление дерева возвращает те же данные, что и при при предыдущем открытии страницы, поэтому кажется, что дерево не поменялось).

Пока других идей нет. Выкладывай проект бум разбираться

PS
не пиши стили в aspx файле, грузи их отдельно в css файле так и удобнее, и проще, и быстрее
Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #10 : 26-08-2010 13:21 » new

Выкладывай проект бум разбираться
так я так его весь уже выложила, не хватает только web.config и 2ух таблиц бд с которыми работает дерево!
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 26-08-2010 13:25 » 

Цитата: lapulya
при изменении DropDownList1 на сервере сначала должна отрабатывать DropDownList1_SelectIndexChange, а только потом Page_Load
Приведён код только для страницы. Нет никаких UserControl. В этом случае Page_Load - метод страницы. Если так, то он всегда выполняется до любого обработчика события. Page_Load пользовательского элемента может выполняться после обработчика на странице, если внутри обработчика на странице делается программный LoadControl данного элемента.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
sav-ledi
Участник

ru
Offline Offline

« Ответ #12 : 27-08-2010 04:48 » 

А как грузить это дерево сразу на страницу, не по уровню каждый раз, а сразу?
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #13 : 27-08-2010 12:12 » 

Dimka, да это я наврал ))) сорри.

sav-ledi
полез разбираться. Кстати, интересный момент в aspx файле у тебя
onselectedindexchanged="DropDownList1_SelectedIndexChanged"
а в cs файле
protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)

как это компилится?

Цитата
А как грузить это дерево сразу на страницу, не по уровню каждый раз, а сразу?
надо:
1. заполнить дерево в Page_load()
2. Убрать обработчик TreeView1_TreeNodePopulate()
3. выставить свойство PopulateOnDemand в false (или убрать его, т.к. false значение по умолчанию)
« Последнее редактирование: 27-08-2010 12:35 от lapulya » Записан

С уважением Lapulya
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 27-08-2010 12:52 » 

Цитата: lapulya
в aspx файле у тебя
onselectedindexchanged="DropDownList1_SelectedIndexChanged"
а в cs файле
protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)

как это компилится?
Элементарно. Если ты присмотришься, то увидишь, что класс страницы объявлен partial, а ввверху aspx-файла дана привязка CodeFile="...". При компиляции из aspx-файла извлекаются элементы с атрибутом runat="server", и создаётся вторая часть класса, где объявляются контролы с идентификаторами, равными ID элементов в aspx-файле. Там же генерируется код привязки обработчиков к событиям.

Словом, всё как и в WinForms, только файл ...designer.cs не создаётся загодя - его в полной мере замещает aspx-файл.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #15 : 27-08-2010 12:53 » 

sav-ledi,
покопался... что могу сказать... то, что дерево не "перестраивается" (перестраивается - плохое слово, оно строится! причем каждый узел строго один раз, после того как узел построен, он уже хранится на клиенте и повторно уже не строится, исключая ту багу о которой ниже) так это так и долно быть! А вот то, что оно (оно - это только! второй уровень) строится во второй раз (ну первый раз понятно, открываем корневу ноду, строится второй уровень, тут все хорошо) это видимо бага дерева. Все! после того как второй уровень построился при открытии корневого узла + указанная бага, значение DropDownList1 никого не интересует ибо перестроения нет (т.е. PopulateCategories больше ни разу не отработает)

Добавлено через 8 минут и 7 секунд:
Dimka, не понял, ты о чем? как это помогает компиляции? я вот про что
onselectedindexchanged="DropDownList1_SelectedIndexChanged"
а в cs файле
protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)

разные имена обработчиков в aspx файле и cs файле



Добавлено через 12 минут и 2 секунды:
sav-ledi,

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

Ты сказала, что это надо на сервере... так вот так, например

Код:
void PopulateProducts(TreeNode node)
{
for (int i = 0; i < 5; i++)
{
TreeNode NewNode = new TreeNode("<input type='button' value='bubu'/><font color = 000000>Products</font>" + "_ " + i.ToString(), i.ToString());
NewNode.PopulateOnDemand = true;
NewNode.SelectAction = TreeNodeSelectAction.Select;
node.ChildNodes.Add(NewNode);

}
}
« Последнее редактирование: 27-08-2010 13:13 от lapulya » Записан

С уважением Lapulya
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 27-08-2010 13:23 » 

lapulya, да, разницу в идентификаторах я не заметил.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
sav-ledi
Участник

ru
Offline Offline

« Ответ #17 : 30-08-2010 05:58 » 

1. заполнить дерево в Page_load()

Как? Пример заполнения дерева я нашла на msdn, как это делается по другому, но из бд я не знаю! подскажите если можно!


Ты сказала, что это надо на сервере... так вот так, например

Код:
void PopulateProducts(TreeNode node)
{
for (int i = 0; i < 5; i++)
{
TreeNode NewNode = new TreeNode("<input type='button' value='bubu'/><font color = 000000>Products</font>" + "_ " + i.ToString(), i.ToString());
NewNode.PopulateOnDemand = true;
NewNode.SelectAction = TreeNodeSelectAction.Select;
node.ChildNodes.Add(NewNode);

}
}

Не button, а imagebutton

Добавлено через 4 часа, 41 минуту и 54 секунды:

2. Убрать обработчик TreeView1_TreeNodePopulate()


А что в этом случае подставлять сюда в aspx файле:   



Код:
<asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged"
         [b]  OnTreeNodePopulate="TreeView1_TreeNodePopulate" [/b]

« Последнее редактирование: 30-08-2010 10:40 от sav-ledi » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #18 : 30-08-2010 13:01 » 

sav-ledi, ничего, это OnTreeNodePopulate="TreeView1_TreeNodePopulate" надо просто убрать за ненадобностью.
Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #19 : 31-08-2010 01:56 » 

А содержимое "TreeView1_TreeNodePopulate" вставить в  Page_load()?
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #20 : 31-08-2010 12:08 » 

sav-ledi,
Цитата
А содержимое "TreeView1_TreeNodePopulate" вставить в  Page_load()?
совершенно верно (правда его надо будет немного изменить, поскольку обход дерева надо будет сделать самому), я же уже об этом писал

Цитата
надо:
1. заполнить дерево в Page_load()
Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #21 : 01-09-2010 02:18 » 

Тогда у меня ещё такой вопрос, как правильно содержимое
TreeView1_TreeNodePopulate(object sender, System.Web.UI.WebControls.TreeNodeEventArgs e)
делегировать в  protected void Page_Load(object sender, EventArgs e)
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #22 : 01-09-2010 22:22 » 

sav-ledi,
ну, например, так

Код:
   protected void Page_Load(object sender, EventArgs e)
    {
if (!IsPostBack)
fillTree();
    }

void fillTree()
{
PopulateCategories(TreeView1.Nodes[0]);
}
void PopulateProducts_TreeNextLayer_3(TreeNode node)
{
for (int i = 0; i < 2; i++)
{
TreeNode NewNode = new TreeNode("<font color = 000000>Products_TreeNextLayer_3</font>" + "_ " + i.ToString(), i.ToString());
NewNode.SelectAction = TreeNodeSelectAction.Select;
node.ChildNodes.Add(NewNode);
}

}
void PopulateProducts_TreeNextLayer_2(TreeNode node)
{
for (int i = 0; i < 2; i++)
{
TreeNode NewNode = new TreeNode("<font color = 000000>Products_TreeNextLayer_2</font>" + "_ " + i.ToString(), i.ToString());
NewNode.SelectAction = TreeNodeSelectAction.Select;
node.ChildNodes.Add(NewNode);

PopulateProducts_TreeNextLayer_3(NewNode);
}

}
void PopulateProducts_TreeNextLayer_1(TreeNode node)
{
for (int i = 0; i < 3; i++)
{
TreeNode NewNode = new TreeNode("<font color = 000000>Products_TreeNextLayer_1</font>" + "_ " + i.ToString(), i.ToString());
NewNode.SelectAction = TreeNodeSelectAction.Select;
node.ChildNodes.Add(NewNode);

PopulateProducts_TreeNextLayer_2(NewNode);
}

}
void PopulateProducts_TreeNextLayer(TreeNode node) // класс построения четвёртого уровня дерева
{
for (int i = 0; i < 3; i++)
{
TreeNode NewNode = new TreeNode("<font color = 000000>Products_TreeNextLayer</font>" + "_ " + i.ToString(), i.ToString());
NewNode.SelectAction = TreeNodeSelectAction.Select;
node.ChildNodes.Add(NewNode);

PopulateProducts_TreeNextLayer_1(NewNode);
}
}
void PopulateProducts_TreeLayer(TreeNode node)
{
for (int i = 0; i < 4; i++)
{
TreeNode NewNode = new TreeNode("<font color = 000000>Products_TreeLayer</font>" + "_ " + i.ToString(), i.ToString());
NewNode.SelectAction = TreeNodeSelectAction.Select;
node.ChildNodes.Add(NewNode);

PopulateProducts_TreeNextLayer(NewNode);
}
}
void PopulateProducts(TreeNode node)
{
for (int i = 0; i < 4; i++)
{
TreeNode NewNode = new TreeNode("<input type='button' value='bubu'/><font color = 000000>Products</font>" + "_ " + i.ToString(), i.ToString());
NewNode.SelectAction = TreeNodeSelectAction.Select;
node.ChildNodes.Add(NewNode);

PopulateProducts_TreeLayer(NewNode);
}
}
void PopulateCategories(TreeNode node)
{
string value_Item = DropDownList1.SelectedValue.Trim();
for (int i = 0; i < 5; i++)
{
TreeNode NewNode = new TreeNode("Categor" + value_Item.ToString() + i.ToString(), value_Item.ToString() + i.ToString());
NewNode.ImageUrl = "http://...";
NewNode.SelectAction = TreeNodeSelectAction.Select;
node.ChildNodes.Add(NewNode);

PopulateProducts(NewNode);
}
}
Но, я бы порекомендовал проверить это на боевом сервере (я не предлагал грузить все дерево целиком), поскольку у меня на машине (соре дуо 2 2,4 ГГц (Т7700) с 4Гб ОЗУ) в дебаге загрузка страницы (не первая, при которой идет сборка, а последующие) занимает до 5 минут!!!!!!! А если у тебя еще и перестроения возможны (не дай бог часты), то это просто ппц (ну для мого ноута точно)

Это у меня еще тупая обработка при построении дерева, а ты представляешь, что будет, если для построения кождой!!! ноды надо будет в БД лезть?
« Последнее редактирование: 01-09-2010 22:33 от lapulya » Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #23 : 02-09-2010 03:15 » 


Но, я бы порекомендовал проверить это на боевом сервере (я не предлагал грузить все дерево целиком), поскольку у меня на машине (соре дуо 2 2,4 ГГц (Т7700) с 4Гб ОЗУ) в дебаге загрузка страницы (не первая, при которой идет сборка, а последующие) занимает до 5 минут!!!!!!! А если у тебя еще и перестроения возможны (не дай бог часты), то это просто ппц (ну для мого ноута точно)

Это у меня еще тупая обработка при построении дерева, а ты представляешь, что будет, если для построения кождой!!! ноды надо будет в БД лезть?

ты знаешь у меня старенький сервак с 4ГБ ОЗУ и проц 2,33 ГГц, по 100 Мб сетке на дебаге моя старая прога грузиться даже при первом построении грузится секунд 10 от силы.
За помощь огромное спасибо!  Я сделала как посоветовал, идею поняла!
Одно но:
Выбрали в дропе объект 1 , загрузилость дерево соответственно объекту 1
выбрали в дропе объект 2, к загруженному дереву соответствующему объекту 1, добавляется ветка соответствующая объекту 2,
выбрали в дропе объект 3, к загруженному дереву соответствующему объекту 1, и  ветке соответствующей объекту 2,
добавилась ветка соответствующая объекту 3, и так далее....
А мне необходимо чтоб в дереве пресутствовали только те  элементы, которые соответствуют объекту выбранному в дропе.
« Последнее редактирование: 02-09-2010 04:35 от sav-ledi » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #24 : 02-09-2010 11:32 » 

sav-ledi, выложи текущий код,  ж не знаю, что ты в итоге написала. Можно аттачами к посту, чтоб не захламлять
Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #25 : 06-09-2010 02:31 » 

Точно как ты посоветовал!

Код:
using 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;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            fillTree();
        }
    }


    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
       
    }


    protected void fillTree()
    {
        PopulateCategories(TreeView1.Nodes[0]);
    }
   


    private DataSet RunQuery(SqlCommand sqlQuery)  // коннект с базой
    {
        string connectionString = ConfigurationManager.ConnectionStrings["........"].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_1(TreeNode node)  // класс пеостроения пятого уровня дерева
    {
        string parentID3 = node.Value.Trim();
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "SELECT..............;
        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.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);

        }
    }





    void PopulateProducts_TreeNextLayer(TreeNode node) // класс построения четвёртого уровня дерева
    {
        string parentID2 = node.Value.Trim();
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "SELECT ............;
        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.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
                PopulateProducts_TreeNextLayer_1(NewNode);
        }

     
    }





    void PopulateProducts_TreeLayer(TreeNode node)
    {
        string parentID1 = node.Value.Trim();
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "SELECT .....................;
        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.SelectAction = TreeNodeSelectAction.SelectExpand;
            node.ChildNodes.Add(NewNode);
            PopulateProducts_TreeNextLayer(NewNode);
     
    }




    void PopulateProducts(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.SelectAction = TreeNodeSelectAction.Select;
                    node.ChildNodes.Add(NewNode);
                    PopulateProducts_TreeLayer(NewNode);
            }
           
       
      }




    void PopulateCategories(TreeNode node)   
    {
        string value_Item = DropDownList1.SelectedValue.Trim();
        SqlCommand sqlQuery = new SqlCommand("select.......... = '" + value_Item + "'");
        DataSet resultSet;
        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() + "<A href = 'http://localhost:2928/WebInterface/Default2.aspx'><img src = 'http://localhost/InputButtonImage.gif' border = 0 alt = 'информация по данному объекту'>", row["ID"].ToString());
               
                NewNode.SelectAction = TreeNodeSelectAction.SelectExpand; 
                node.ChildNodes.Add(NewNode); 
                PopulateProducts(NewNode);
            }
         
        }
       
    }

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
       
    }

}

   
   
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #26 : 06-09-2010 17:05 » 

sav-ledi,
ну если как я предлагал (я код не сверял ))) ), тогда реализацию DropDownList1_SelectedIndexChanged сделай такую:

Код:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
TreeView1.Nodes[0].ChildNodes.Clear();
fillTree();
}

хотя строчку зачищающую дерево можно и в fillTree вставить.

ну как, тот код, что получился быстро работает?
« Последнее редактирование: 06-09-2010 17:07 от lapulya » Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #27 : 07-09-2010 07:31 » 

Этот код работает намного медленнее, разница в том что в старом коде при вызове TreeView грузилось 5 строчек, а остальные последовательно при следующих вызовах, а теперь 300 одновременно. Но по этому коду свободно можно сделать поиск с открытием узлов, а по тому это не реально. Огромное спасибо тебе за помощь!!!!!

Такой ещё вопрос:
если вернуться к старому коду, как правильно синтаксически в обработчике
 protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
вызвать метод
 protected void TreeView1_TreeNodePopulate(object sender, System.Web.UI.WebControls.TreeNodeEventArgs e)
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #28 : 07-09-2010 23:11 » 

sav-ledi,
если хочешь, чтобы динамически подгружалось (типа быстро страница открывалась), то верни как у тебя все было (из функций построения каждого уровня убери вызов функции построения нижеследующего уровня) и обработчик DropDownList1_SelectedIndexChanged такой

Код:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
TreeNode root = TreeView1.Nodes[0];
root.ChildNodes.Clear();
PopulateCategories(root);
}

кстати в MS VS 2010 (последний фреймворк... может и раньше умело, но гарантии не даю) дерево умеет делать асинхронную подгрузку данных с сервера
Записан

С уважением Lapulya
sav-ledi
Участник

ru
Offline Offline

« Ответ #29 : 13-09-2010 03:48 » 

Спасибо, всё работает!!!
Вернусь к вопросу imagebutn!
я её сделала примерно верно как ты сказал через javascript:

 void PopulateCategories(TreeNode node)   
    {
        string value_Item = DropDownList1.SelectedValue.Trim();
        SqlCommand sqlQuery = new SqlCommand("select.......... = '" + value_Item + "'");
        DataSet resultSet;
        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() + "<A href = 'Default2.aspx'><img src = 'http://localhost/InputButtonImage.gif' border = 0 alt = 'информация по данному объекту'>", row["ID"].ToString());
               
                NewNode.SelectAction = TreeNodeSelectAction.SelectExpand; 
                node.ChildNodes.Add(NewNode); 
                PopulateProducts(NewNode);
            }
         

я не догоняю вот чего: возле каждого нода (по которому в базе имеется информация) у меня ставится кнопока, по ножатию на которую должена открыться страница Default2.aspx, на которой в TextBox должно отобразится Название того узла кнопка которого нажата!При этом сам узел не  выбран (на select узла у меня написан другой обработчик)
Связи между нодом и кнопкой не существует, кнопка просто отбражается рядом с узлом,
 как мне в javascript  передать значение узла, возле которого она находится, и вообще установить между ними связь!
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines