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

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

Выкладывай проект бум разбираться
так я так его весь уже выложила, не хватает только 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  передать значение узла, возле которого она находится, и вообще установить между ними связь!
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #30 : 13-09-2010 08:31 » 

ну ты же ссылку <A href = 'Default2.aspx'> формируешь на сервере, ну дык сформируй ее с теми параметрами, которые тебе нужны, ну так например (я ж не знаю, что нужно то)

<A href = 'Default2.aspx?id=12&product_id=234&categoty_id=83&my_lovely_parameter=BUBUBU'>

вообще вариантов масса, можно, например, разгрзить сервер + отделить данные от представления, т.е. формированием ссылок (а заодно и стилей и т.д.) заниматься на клиенте (и кнопки тоже на клиенте добавлять). Т.е. задача сервера только передать данные, например так:

TreeNode NewNode = new TreeNode("<data id=" + row["ID"].ToString() + " data1=" + row["CODE"].ToString() + " data2=" + row["SP1738"].ToString() + "/>");

а на клиенте раскрашивай как хочешь, чуть больше возни (и javascript надо знать), зато как чистенько получается с сервера только данные, на клиенте все что хочешь, хоть xsl применяй.
Записан

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

ru
Offline Offline

« Ответ #31 : 30-09-2010 10:28 » 

Подскажите пожалуйста кто может, как в GridView
1) зафиксировать шапку?
2) сделать так чтобы строки сворачивались и разворачивались
по признаку
1
1.1
1.1.1
1.1.2
1.2
и т.д
GridView грузится из базы, вот Код:
Код:
<asp:Panel ID="Panel2" runat="server"
         
         Style="border-style: groove; position:absolute; top: 193px; left: 12px; width: 1237px; height: 639px;"
         ScrollBars="Vertical">
         
         <asp:GridView ID="GridView1" runat="server"
         Style =" position:absolute; top: -1px; left: -2px; width: 1223px; height: 645px;"
        DataSourceID = "SqlDataSource1" CellPadding="4"
        onselectedindexchanged="GridView1_SelectedIndexChanged"   ShowFooter="True"
       
         ForeColor="#333333" CellSpacing = "1"
         BorderWidth="1px" Font-Size="Small"
         AllowSorting="True" EnableSortingAndPagingCallbacks="True"
         HorizontalAlign="Center" PageSize="13"
         EnableTheming="True">
        <FooterStyle BackColor="#6699FF" ForeColor="White" Font-Bold="True" />
        <RowStyle BackColor="#EFF3FB" />
        <PagerStyle ForeColor="White" HorizontalAlign="Center" BackColor="#2461BF" />
        <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
        <HeaderStyle BackColor="#6699FF" Font-Bold="True" ForeColor="White"
            BorderColor="#FFFFCC" Font-Size="Medium" />
        <AlternatingRowStyle BackColor="White" />
         </asp:GridView>
     </asp:Panel>
asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:.....2 %>"
                SelectCommand="SELECT ...... = @id"
                onselecting="SqlDataSource1_Selecting">
                <SelectParameters>
                <asp:QueryStringParameter Name = "id" QueryStringField = "id" />
                </SelectParameters>
            </asp:SqlDataSource>
Записан
sav-ledi
Участник

ru
Offline Offline

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

И если можно подскажите где косяк.
Я c javascript знакома поверхностно, а тем более как правильно интегрировать его в C#ный код знаю на интуитивном уровне.
Задача: рядом с некоторыми узлами в treeview отображается нечто типа imagebutton, реализованно это в aspx.cs так:
Код:
foreach (DataRow rowTemp in ResultSetTemp.Tables[0].Rows)
        {
            TreeNode NewNode = new TreeNode(rowTemp["CODETRIM"].ToString() + "_ " + rowTemp["SP2849TRIM"].ToString() + "<img src = 'http://localhost/InputButtonImage.gif' border = 0  onmouseout = 'Turn(1,0); over_header[1]=0;' onmouseover='Turn(1,1); over_header[1] = 1;'>", rowTemp["IDTRIM"].ToString());
            NewNode.PopulateOnDemand = false;
            NewNode.SelectAction = TreeNodeSelectAction.SelectExpand;
            node.ChildNodes.Add(NewNode);
        }



При наведений мыши на эту imagebutton, мне необходимо сделать всплывающее меню. Нашла пример, написала в .aspx вот это:

Код:
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Электронный архив проектно-сметной документации"</title>
    <style>
.smenu
{
position:absolute;
padding: 5px;
width: 100px;
visibility:hidden;
background-color: #EEEEEE;
border: 1px solid gray;
}               
    </style>
<script language="javascript" type="text/javascript">
<!--
over_header = new Array();
over_menu = new Array();
for (i=1; i<=3; i++)
{
  over_header[i] = 0;
  over_menu[i]=0;
}
function Turn(id, mode)
{
  if(mode)
  eval("setTimeout(\"On(" + id + ");\", 200)");
  else
  eval("setTimeout(\"Off(" + id + ");\", 200)");
}
function On(id)
{
 eval("document.getElementById('smenu" + id + "')").style.visibility = "visible";
}
function Off(id)
{
  if(!over_menu[id] && !over_header[id])
  {
    eval("document.getElementByid('smenu" + id + "')").style.visibility = "hidden";
  }
}

-->
</script>
</head>



<div id="smenu1" class ="smenu" style="position:absolute; top:0; left: 0; width: 80"  onmouseover=" over_menu[1]=1;" onmouseout=" Turn(1,0); over_menu[1]=0">
     <a href ="Default2.aspx">Этапы</a>
     <a href ="Default3.aspx">Информация о документации</a>>
    </div>

Запускаю! Сообщение:
"Ошибка выполнения Microsoft JScript: Объект не поддерживает это свойство или метод!"
 и выделяет строку getElementByid('smenu1')
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #33 : 30-09-2010 14:53 » 

sav-ledi, в  getElementByid('smenu1') буква i написана с маленькой буквы, а надо с большой

Зачем в коде (код не смотрел, просто мельком глянул) столько eval? Это чтобы хорошенько по...париться при отладке?

Что касается javascript, то очень рекомендую посмотреть в сторону jquery
« Последнее редактирование: 30-09-2010 15:25 от lapulya » Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #34 : 30-09-2010 15:01 » 

sav-ledi,
1) зафиксировать шапку?
2) сделать так чтобы строки сворачивались и разворачивались

По пункту 1 - что такое "зафиксировать шапку"? Из вопроса я так и не понял что нужно сделать.
По пункту 2 - надо это сделать на сервере или на клиенте?
« Последнее редактирование: 30-09-2010 15:03 от lapulya » Записан

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

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

« Ответ #35 : 30-09-2010 21:41 » 

lapulya, "зафиксировать шапку" означает, что вся страница должна быть непрокручиваемой, а внутри неё находится таблица, у которой прокручиваются только строки с данными, заголовки же остаются неподвижными сверху.

Действие по сворачиванию-разворачиванию заведомо предназначено для пользователя, т.е. клиент в этом будет участвовать в любом случае. С учётом разбиравшейся выше динамической подгрузки данных для дерева, скорее всего, аналогично и в данном случае.
Записан

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

ru
Offline Offline

« Ответ #36 : 01-10-2010 01:31 » 

Если я правильно понял Димку про шапку (а он угадал то, что хочет топикстартер), то таблица, приходящая с сервера, имеет больше строк, чем хотелось бы видеть на экране и зафиксированная шапка + прокрутка строк позволит комфортно работать с данными не прокручивая страницу (эсли это не так, то я снова не понял что же нужно), тогда я бы решал проблему на клиенте и действовал бы примерно так...
1. создаем div на странице, внури которого бум отображать прокручиваемые строки таблицы. CSS задаем размеры и прокрутку содержимого у этого div
2. Грид без заголовка (отчнее он есть но скрыт) отдает данные именно в этот div
3. Выше div помещаем user control который на клиенте строит (копирует) шапку из скрытой шапки грида (причем копирует он не только данные, но и ширину каждого из столбцов, прописывая ее явно).

Это простой вариант попроще, но он менее удобный, если чуть серьезнее, то делаем серверный web control, который наследуем от грида и работает он как написано выше.

Теперь про разворачивание, то тут, как правильно заметил Димка, можно сделать как у дерева двумя вариантами:
1. разворачивать и сворачивать одними постбеками, тогда клиент тут ничего не делает (только запрос на сервер шлет, как при нажатии на серверную кнопку)
2. разворачивать и сворачивать javascript, но для этого надо или иметь все данные на клиенте, или асинхронно их подгружать.

Что бы не гадать, предлагаю для начала выбрать способ.

PS
Не сочтите за рекламу (я никакого отношения к товарищам не имею), но тут http://www.componentart.com/ есть на что посмотреть...
Вот тут всякие там гриды http://aspnetajax.componentart.com/control-specific/datagrid/features/core_features/default.aspx
А тут иерархические гриды http://aspnetajax.componentart.com/control-specific/datagrid/features/hierarchical_display/WebForm1.aspx

Оттуда можно интересные идеи и способы реализации спереть )))
« Последнее редактирование: 01-10-2010 01:54 от lapulya » Записан

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

ru
Offline Offline

« Ответ #37 : 04-10-2010 04:00 » 

Спасибо огромное за ссалки, очень помог!!!
с косяками в javascript разобралась!
Теперь вопрос по sql server:
Как задать расписание для экспорта/импорта данных между базами!
есть рабочая база, которая постоянно доробатывается. если я делаю coonect к ней, то там постоянно весит пользователь, и сохранить конфигарацию разработчикам не удаётся. Чтоб этого не происходило, я (пока) ручками делаю экспорт необходимых мне таблиц в другую базу на этом же сервере, и connect устанавлию уже к ней! В рабочей базе данные постоянно обновляются. Как правильно автоматом обновлять данные через определённый промежуток времени?
Я почитала про DTS пакеты, но конкретных примеров или инструкций как задать это расписание пока не нашла!
если ко сталкивался подскажите!!!
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #38 : 04-10-2010 07:43 » 

Вообще это вопрос в другой раздел, который называется "Базы данных".

Для выполнения действий по расписанию смотреть нужно SQL Agent и его работы (job).
Записан

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

ru
Offline Offline

« Ответ #39 : 04-10-2010 09:13 » 

Щас наверное задам до ужаса ламеркий вопросс, но всё же:
Как автоматом связать всплывающее меню с элементами управления, если их сотни!
У меня прктически возле каждого элемента дерева отображается img, делается это в цикле
Как сделать так чтоб при наведении мыши на img появлялось это меню возле каждой img, а не в одном месте как сейчас!
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #40 : 04-10-2010 11:37 » 

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

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

ru
Offline Offline

« Ответ #41 : 04-10-2010 12:08 » 

Можно как предложил Димка, а можно этого добиться построением соответствующего DOM. Т.е. когда меню не активно, оно скрыто, а когда его нужно показать, то блок в котором находится меню перемещается (не координатами, а сменой родителя) в нужное место и отображается.

В любом случае используя jquery это пол строчки кода.
Записан

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

ru
Offline Offline

« Ответ #42 : 04-10-2010 12:31 » 

можно этого добиться построением соответствующего DOM. Т.е. когда меню не активно, оно скрыто, а когда его нужно показать, то блок в котором находится меню перемещается (не координатами, а сменой родителя) в нужное место и отображается.

В любом случае используя jquery это пол строчки кода.

а можно примерчик, по  поводу смены родителя? я это себе пока слабо предстовляю, ведь у меня эти img создаются вот так:
TreeNode NewNode = new TreeNode(rowTemp["CODETRIM"].ToString() + "_ " + rowTemp["SP2849TRIM"].ToString() + "<img src = 'http://localhost/InputButtonImage.gif' border = 0  onmouseout = 'Turn(1,0); over_header[1]=0;' onmouseover='Turn(1,1); over_header[1] = 1;'>", rowTemp["IDTRIM"].ToString());
а узлов в дереве пордка полутора тысяч!!!
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #43 : 05-10-2010 12:13 » 

ну примерно так... при этом количество узлов в дереве никакого значения не имеет, хоть миллион... (Димкино решение так же не зависит от количества узлов в дереве)
Код:
<script  type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
$(document).ready(function ()
{
var subMenu = $('#subMenuId');
$('#treeId div[name="leaf"] span').
mouseover(function (event)
{
subMenu.detach().appendTo(event.target).show();
}).
mouseout(function (event)
{
subMenu.hide();
});
});
</script>

    <form id="form1" runat="server">
<div id="treeId">
<div id="subMenuId" style="position:absolute; height:20px; width:20px; background-color: maroon;"></div>
Tree
<div name="leaf"><span>1</span>
<div name="leaf"><span>11</span></div>
<div name="leaf"><span>12</span>
<div name="leaf"><span>121</span></div>
<div name="leaf"><span>122</span></div>
</div>
</div>
<div name="leaf"><span>2</span></div>
<div name="leaf"><span>3</span>
<div name="leaf"><span>31</span></div>
<div name="leaf"><span>32</span></div>
<div name="leaf"><span>33</span></div>
</div>
</div>
    </form>

Ну это при условии, что контекстное меню у всех одинаковое
« Последнее редактирование: 05-10-2010 12:16 от lapulya » Записан

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

ru
Offline Offline

« Ответ #44 : 06-10-2010 05:16 » 

МЕГА СПАСИБО!!!!
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #45 : 08-10-2010 13:43 » 

Во! Про шапку! Все решается использованием CSS без скрипта, оказывается overflow можно задать для tbody. См пример
http://www.htmldrive.net/items/demo/34/Pure-CSS-Scrollable-Table-with-Fixed-Header
Записан

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

ru
Offline Offline

« Ответ #46 : 11-10-2010 05:14 » 

Слушайте, товарищи Коллеги!!!!
У меня новая проблема:
Подскажите в какую сторону смотреть!
Google даёт разные направления и htm, и WPF, и  ActivX и т.д....везде по чуть-чуть почитала, мозг вскипел!
Мне необходимо на одной из страниц своего web интерфейса разместить несколько графиков, которые должны стриться опять же по данным взятым из бд + параметры выбранные на самой странице.
например:
 просмотреть разницу  между планом и фактом(гистограмма) поставки оборудования(из бд) за определённый периуд времени(календарь на портале) по данной стройке(выбранный treenode из treeview)
Ваше мнение? как и с помощью какой технологии эту задачу лучше реализовывать???
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #47 : 11-10-2010 06:39 » 

Графики должны быть просто картинками или у них должны быть возможности для пользователя: изменять масштаб (приближать/отдалять), крутить (если 3D), трассировать (для указанной пользователем точки выдаются числовые значения по координатам), менять форму (переключаться между линиям/гистограммами и т.п.)?
Записан

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

ru
Offline Offline

« Ответ #48 : 11-10-2010 09:18 » 

Присоединяюсь к Димке и до кучи:
1. Нужно готовое решение или надо самому написать посроитель графиков?
2. Надо строить графики на клиенте или сервере (ActiveX к серверу отношения не имеет скорее всего)?
3. Может нужен триллдаун?

PS
bar гистограмму забодяжить на клиенте - пара строчек на javascript (причем с дриллдаун и т.д.). Что-то фильдеперсовое надо на сервере картинкой/картинками делать.
« Последнее редактирование: 11-10-2010 09:26 от lapulya » Записан

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

ru
Offline Offline

« Ответ #49 : 11-10-2010 09:58 » 

чтоб пользователь мог трассировать и изменять масштаб...

Добавлено через 19 минут и 47 секунд:
Присоединяюсь к Димке и до кучи:
1. Нужно готовое решение или надо самому написать посроитель графиков?
до лампочки!!! но хотелось бы самой написать(опыта набраться), но для примера не откожусь от готового решения!

2. Надо строить графики на клиенте или сервере (ActiveX к серверу отношения не имеет скорее всего)?

наверное всё же на сервере, так строиться будет по данным из бд

3. Может нужен триллдаун?

что такое триллдаун?

PS
bar гистограмму забодяжить на клиенте - пара строчек на javascript (причем с дриллдаун и т.д.). Что-то фильдеперсовое надо на сервере картинкой/картинками делать.

как забодяжить гистограмму на javascript если её опять же строить надо по данным из бд! но за примерчик благодарна буду!
« Последнее редактирование: 11-10-2010 10:18 от sav-ledi » Записан
Dimka
Деятель
Команда клуба

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

« Ответ #50 : 11-10-2010 12:24 » 

Цитата: sav-ledi
чтоб пользователь мог трассировать и изменять масштаб...
Тогда лучше всего будет Flash или его аналоги типа Silverlight-объектов, JavaFX, можно и ActiveX и Java-апплет, но это устаревшие технологии. Если у клиентов браузер - не IE, то можно и собственный скриптовый движок сделать для элемента canvas.

График строить на клиенте в соотствующей среде, указанной выше, эта среда должна запрашивать данные с сервера.
Записан

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

ru
Offline Offline

« Ответ #51 : 11-10-2010 15:54 » 

sav-ledi,
Цитата
наверное всё же на сервере, так строиться будет по данным из бд
ну дык оно и понятно, что данные из бд, кто бы сомневался... Но речь идет о построении, а не о получении данных, ну например:
Код:
<style type="text/css">
   .bar
   {
border:1px solid #0000ff;
width:15px;
float:left;
margin-right:5px;
   }
   .bar div
   {
-moz-transform: rotate(90deg);
-webkit-transform: rotate(90deg);
-o-transform: rotate(90deg);
writing-mode: tb-rl;
padding:1px;
   }    
   .axis
   {
border-left: 1px solid #000000;
border-bottom: 1px solid #000000;
float:left;
padding:5px;
   }
</style>

</head>
<body>

<script  type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
$(document).ready(function ()
{
var axis = $('<div class="axis"/>');
var max = 0;
$('span[name="data"] span').
each(function ()
{
var cur = 1 * $(this).attr('col3');
if (max < cur)
max = cur;
}).
each(function ()
{
var height = $(this).attr('col3');
var caption = $(this).attr('col2');
$('<div class="bar" style="height:' + height + 'px; margin-top:' + (max - height) + 'px"><div>' + caption + '</div></div>').
appendTo(axis);
}).remove();

axis.append($('<div style="clear:both"/>')).appendTo('#canvas');
});
</script>

    <form id="form1" runat="server">
<div id="canvas"></div>
    </form>

<span name="data" style="display:none" col1="Header1" col2="Header2" col3="Header3">
<span col1="1" col2="bu1" col3="123"></span>
<span col1="2" col2="bu2" col3="62"></span>
<span col1="3" col2="bu3" col3="49"></span>
<span col1="4" col2="bu4" col3="172"></span>
<span col1="5" col2="bu5" col3="81"></span>
<span col1="6" col2="bu6" col3="214"></span>
<span col1="7" col2="bu7" col3="89"></span>
<span col1="8" col2="bu8" col3="59"></span>
<span col1="9" col2="bu9" col3="36"></span>
<span col1="10" col2="bu10" col3="47"></span>
<span col1="11" col2="bu11" col3="127"></span>
</span>
Данные заключены в span чисто для того, что бы их понял ie, для других браузеров можно использовать другие теги

Цитата
что такое триллдаун?

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

Цитата
как забодяжить гистограмму на javascript если её опять же строить надо по данным из бд! но за примерчик благодарна буду!

см пример выше

Добавлено через 12 минут и 12 секунд:
sav-ledi,
Если ломает или долго/не красиво и т.д.
http://www.jqplot.com/
http://jurius.name/work/javascript/2010/5-plaginov-k-jquery-dlya-risovaniya-grafikov.html
http://moradan.sopovs.com/2009/12/jquery.html
« Последнее редактирование: 11-10-2010 16:11 от lapulya » Записан

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

ru
Offline Offline

« Ответ #52 : 12-10-2010 03:35 » 

Спасибо огромное! поняла что javascript лучший наверное вариант, попробую!
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #53 : 12-10-2010 11:40 » 

Javascript хорош, но для определенных целей. Вот посмотри, что можно сделать, если формировать графики на сервере (или как вариант использовать флеш на клиенте, при условии, что html5 не используется)

http://aspnetajax.componentart.com/control-specific/chart/interactive_demos/toolbar/default.aspx
http://aspnetajax.componentart.com/design-showcase/chart/default.aspx
Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #54 : 17-10-2010 11:55 » 

Не могу редактировать свое сообщение, поэтому добавляю новое ((

Вот еще интересно (сильверлайт)
http://www.componentart.com/products/dv/charting.aspx
Записан

С уважением Lapulya
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines