none
Сложная шапка GridView RRS feed

  • Вопрос

  • Добрый день!

    Есть база данных из трех столбцов: 

    1. ID - Уникальный идентификатор

    2. ParentID - Родитель 

    3. Title - Наименование.

    Данная база используется для построения динамического TreeView.

    У меня стоит следующая задача: Сделать из этой базы многоуровневую шапку для GridView с объединением ячеек как по-вертикали так и по-горизонтали.

    Подтолкните на верный путь. Уже пол-дня сижу... 

    31 июля 2014 г. 12:05

Ответы

  • Все я сделал. Может кому пригодится.

    Сделал таблицу:

    <asp:Table ID="Evaluation_table_main" runat="server">
            
    </asp:Table>

    Заполнение таблицы:

         void FillMainTable(int id_section)
            {      
                if (Session["Employees_dt_catalog"] != null)
                {
    
                    DataTable dt_temp = (DataTable)Session["Employees_dt_catalog"];
                    DataRow[] rows = dt_temp.Select("ParentID='" + id_section + "'");
    
                    //строка и ячейка главной таблицы
                    TableHeaderRow asp_row = new TableHeaderRow();
                    TableCell asp_cell = new TableCell();
                    
                    //вложенная таблица
                    HtmlTable html_table = new HtmlTable();
                    HtmlTableRow html_row = new HtmlTableRow();
                    
                    foreach (DataRow row in rows)
                    {
                        HtmlTableCell html_cell = new HtmlTableCell("th") { InnerText = row.ItemArray[2].ToString() };
                        html_cell.ID = row.ItemArray[0].ToString();
                        html_cell.Style.Add("border", "1px solid black");
    
                        int id_ = Convert.ToInt32(row["ID"]);
                        FillMainTableChild(dt_temp, id_, html_cell);
    
                        html_row.Cells.Add(html_cell);
                    }
    
                    html_table.Rows.Add(html_row);
    
                    asp_cell.Controls.Add(html_table);
                    asp_row.Cells.Add(asp_cell);
    
                    Evaluation_table_main.Rows.Add(asp_row);
    
                    Evaluation_table_main.DataBind();
                }
            }
    
            void FillMainTableChild(DataTable dt_temp, int id_, HtmlTableCell cell_parent)
            {
                DataRow[] rows = dt_temp.Select("ParentID='" + id_ + "'");
    
                //вложенная таблица
                HtmlTable table_html = new HtmlTable();
                HtmlTableRow row_html = new HtmlTableRow();
    
                foreach (DataRow row in rows)
                {
                    HtmlTableCell cell_html = new HtmlTableCell("th") { InnerText = row.ItemArray[2].ToString() };
                    cell_html.ID = row.ItemArray[0].ToString();
                    cell_html.Style.Add("border", "1px solid black");
                    
    
                    int _id = Convert.ToInt32(row["ID"]);
                    FillMainTableChild(dt_temp, _id, cell_html);
    
                    row_html.Cells.Add(cell_html);
                }
    
                table_html.Rows.Add(row_html);
    
                cell_parent.Controls.Add(table_html);
            }

    • Помечено в качестве ответа ilya83 4 августа 2014 г. 11:26
    4 августа 2014 г. 10:52

Все ответы

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

    Сделаем содержимое сообщества лучше, вместе!

    1 августа 2014 г. 9:48
    Модератор
  • Вот что у меня есть сейчас

    А мне надо получить


    • Изменено ilya83 4 августа 2014 г. 5:20
    4 августа 2014 г. 5:02
  • Вложенность TreeView может быть любой. Буду благодарен за любые подсказки.
    • Изменено ilya83 4 августа 2014 г. 5:04
    4 августа 2014 г. 5:03
  • это получается нужно таблицу рекурсивно строить. Я бы не взялся за GridView, а посоветовал бы вам самостоятельно написать клиентский код, который сначала подготовит таблицу, зная сколько колонок и строк с соответствующими colspan и rowspan, и тогда прорисовывать.


    Mak Arti

    • Предложено в качестве ответа YatajgaEditor 4 августа 2014 г. 7:22
    4 августа 2014 г. 6:20
  • Ну что-то вроде этого я и пытаюсь сделать, но никак пока не могу провернуть. Если использовать в качестве DataSource DataTable - там не возможно построить многоуровневую шапку. Думаю заполнить таблицу данными с помощью DataTable, а на событии OnDataBound (у GridView) с нуля рисовать шапку.
    4 августа 2014 г. 6:41
  • У вас не простая ситуация, стандартной привязкой вам этого не сделать. Нужно смотреть в сторону рекурсии, как подсказали выше. Да и обычный грид в данной ситуации я бы вам не советовал испоьзовать. Используйте серверный код для генерации простого HTML, одна таблица вложена в другую. Т.е. получается рекурсивный метод, который обходит каждую ветку дерева и строит столбец для него. Если эта ветка сама содержит другие в себе, то шаг повторяется для него созданием новой таблицы (обыная таблица HTML). К сожалению на данный момент нет времени привести пример кода, но это не очень сложно.

    Сделаем содержимое сообщества лучше, вместе!

    4 августа 2014 г. 7:26
    Модератор
  • Спасибо за ответ. Буду пробовать с обычной HTML-таблицой.
    4 августа 2014 г. 7:32
  • Да и с JS потом работать будет легче, получится чистый и гибкий код. А такие старые костыли как GridView для таких задач мало пригодны, они устарели со своим ViewState и прочими. Лучше выкинуть их на помойку. Для простых ситуаций они годятся.

    Сделаем содержимое сообщества лучше, вместе!

    4 августа 2014 г. 7:36
    Модератор
  • Все я сделал. Может кому пригодится.

    Сделал таблицу:

    <asp:Table ID="Evaluation_table_main" runat="server">
            
    </asp:Table>

    Заполнение таблицы:

         void FillMainTable(int id_section)
            {      
                if (Session["Employees_dt_catalog"] != null)
                {
    
                    DataTable dt_temp = (DataTable)Session["Employees_dt_catalog"];
                    DataRow[] rows = dt_temp.Select("ParentID='" + id_section + "'");
    
                    //строка и ячейка главной таблицы
                    TableHeaderRow asp_row = new TableHeaderRow();
                    TableCell asp_cell = new TableCell();
                    
                    //вложенная таблица
                    HtmlTable html_table = new HtmlTable();
                    HtmlTableRow html_row = new HtmlTableRow();
                    
                    foreach (DataRow row in rows)
                    {
                        HtmlTableCell html_cell = new HtmlTableCell("th") { InnerText = row.ItemArray[2].ToString() };
                        html_cell.ID = row.ItemArray[0].ToString();
                        html_cell.Style.Add("border", "1px solid black");
    
                        int id_ = Convert.ToInt32(row["ID"]);
                        FillMainTableChild(dt_temp, id_, html_cell);
    
                        html_row.Cells.Add(html_cell);
                    }
    
                    html_table.Rows.Add(html_row);
    
                    asp_cell.Controls.Add(html_table);
                    asp_row.Cells.Add(asp_cell);
    
                    Evaluation_table_main.Rows.Add(asp_row);
    
                    Evaluation_table_main.DataBind();
                }
            }
    
            void FillMainTableChild(DataTable dt_temp, int id_, HtmlTableCell cell_parent)
            {
                DataRow[] rows = dt_temp.Select("ParentID='" + id_ + "'");
    
                //вложенная таблица
                HtmlTable table_html = new HtmlTable();
                HtmlTableRow row_html = new HtmlTableRow();
    
                foreach (DataRow row in rows)
                {
                    HtmlTableCell cell_html = new HtmlTableCell("th") { InnerText = row.ItemArray[2].ToString() };
                    cell_html.ID = row.ItemArray[0].ToString();
                    cell_html.Style.Add("border", "1px solid black");
                    
    
                    int _id = Convert.ToInt32(row["ID"]);
                    FillMainTableChild(dt_temp, _id, cell_html);
    
                    row_html.Cells.Add(cell_html);
                }
    
                table_html.Rows.Add(row_html);
    
                cell_parent.Controls.Add(table_html);
            }

    • Помечено в качестве ответа ilya83 4 августа 2014 г. 11:26
    4 августа 2014 г. 10:52