Дерево сетки данных (два уровня) - динамически генерируемые сетки не могут быть изменены - PullRequest
0 голосов
/ 22 июля 2010

Я пытаюсь реализовать сетку данных в виде дерева с двумя уровнями.

Я связываю свои данные следующим образом:

private void BindData()
    {
        string sqlQuery = "SELECT dept_code, dept_name FROM Department";
        conn = new SqlConnection();
        conn.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\saher\Documents\TreeTest\TreeDemo\App_Data\TreeData.mdf;Integrated Security=True;User Instance=True";

        try
        {
            if (conn.State == System.Data.ConnectionState.Closed)
            {
                conn.Open();
            }
            SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, conn);
            DataSet ds = new DataSet();
            adapter.Fill(ds, "DepInfo");
            DataGrid1.DataSource = ds;

            DataGrid1.DataBind();

        }
        catch (Exception e)
        {
            Response.Write("An Error Has occured!");
            //Response.End();
            Response.Write(e.ToString());
        }
        finally
        {
            if (conn.State == System.Data.ConnectionState.Open)
            {
                conn.Close();
            }
        }
    }

моя функция ItemDataBound для моей сетки данных выглядит следующим образом:

protected void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
        //If your page size is 10, only 10 sub queries will be done.
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            string newSqlQuery = "SELECT S.staff_name FROM Staff as S where S.dep_code ='" + e.Item.Cells[1].Text + "'";
            //Here I am grabbing the additional data and putting it
            //into mini datagrids…
            //If you wish to just use labels, or other controls, just
            //bind the data as you
            //wish, and render to html as I did.

            DataSet ds = this.RunQuery(newSqlQuery);
            DataGrid NewDg = new DataGrid();
            NewDg.AutoGenerateColumns = false;
            NewDg.Width = Unit.Percentage(100.00);
            DataGridTemplate temp = new DataGridTemplate(ListItemType.Item, "staffCol");
            TemplateColumn tempCol = new TemplateColumn();
            tempCol.ItemTemplate = temp;
            BoundColumn bound = new BoundColumn();
            bound.DataField = "staff_name";
            NewDg.Columns.Add(tempCol);
            NewDg.Columns.Add(bound);
            NewDg.DataSource = ds;
            NewDg.DataBind();
            SetProps(NewDg);

            subGrids.Add(NewDg); // subGrids is a private ArrayList I have to store the grids.



            /**
            System.IO.StringWriter sw = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);
            datagrid.RenderControl(htw);
            string DivStart = "<DIV id=’uniquename" + e.Item.ItemIndex.ToString() + "‘ style=’DISPLAY: none;’>";
            string DivBody = sw.ToString();
            string DivEnd = "</DIV>";
            string FullDIV = DivStart + DivBody + DivEnd;
            int LastCellPosition = e.Item.Cells.Count - 1;
            int NewCellPosition = e.Item.Cells.Count - 2;
            e.Item.Cells[0].ID = "CellInfo" + e.Item.ItemIndex.ToString();
            if (e.Item.ItemType == ListItemType.Item)
            {
                e.Item.Cells[LastCellPosition].Text = e.Item.Cells[LastCellPosition].Text +
                "</td><tr><td bgcolor=’f5f5f5′></td><td colspan=’" +
                NewCellPosition + "‘>" + FullDIV;
            }
            else
            {
                e.Item.Cells[LastCellPosition].Text = e.Item.Cells[LastCellPosition].Text +
                "</td><tr><td bgcolor=’d3d3d3′></td><td colspan=’" +
                NewCellPosition + "‘>" + FullDIV;
            }
            **/
            System.IO.StringWriter sw = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);
            datagrid.RenderControl(htw);
            string DivStart = "<DIV id=\"uniquename" + e.Item.ItemIndex.ToString() + "\" style=\"display:none\";’>";
            string DivBody = sw.ToString();
            string DivEnd = "</DIV>";
            string FullDIV = DivStart + DivBody + DivEnd;
            int LastCellPosition = e.Item.Cells.Count - 1;
            int NewCellPosition = e.Item.Cells.Count - 2;
            e.Item.Cells[0].ID = "CellInfo" + e.Item.ItemIndex.ToString();
            if (e.Item.ItemType == ListItemType.Item)
            {
                e.Item.Cells[LastCellPosition].Text = e.Item.Cells[LastCellPosition].Text +
                "</td><tr id =row" + e.Item.ItemIndex.ToString() + "><td bgcolor=’000000′></td><td colspan=’" +
                NewCellPosition + "‘>" + FullDIV;
            }
            else
            {
                e.Item.Cells[LastCellPosition].Text = e.Item.Cells[LastCellPosition].Text +
                "</td><tr id =row" + e.Item.ItemIndex.ToString() + "><td bgcolor=’d3d3d3′></td><td colspan=’" +
                 NewCellPosition + "‘>" + FullDIV;
            }

            //============Set up javascript methods.=============
            e.Item.Cells[0].Attributes["onclick"] = "HideShowPanel('uniquename" +
         e.Item.ItemIndex.ToString() + "'); ChangePlusMinusText('" +
         e.Item.Cells[0].ClientID + "'); SetExpandedDIVInfo('" +
         e.Item.Cells[0].ClientID + "','" + this.txtExpandedDivs.ClientID +
         "', 'uniquename" + e.Item.ItemIndex.ToString() + "');"; 

            e.Item.Cells[0].Attributes["onmouseover"] = "this.style.cursor='pointer'";
            e.Item.Cells[0].Attributes["onmouseout"] = "this.style.cursor='pointer'";

            Session["checkSession"] = subGrids; // I store the ArrayList in the session so that I won't loose the dataGrids after a post back.                       
        }

    }

В моей исходной сетке данных есть столбец шаблона с флажками, а в сгенерированных сетках данных также есть два столбца: один для имени персонала и один столбец шаблона с флажками. Единственное, на чем я застрял, это то, что я хочу отметить все флажки в NewDg, которые я делаю для каждой строки.

FindControl(id) функция не работает (находит ноль) для моих dataGrids, даже когда я установил уникальные идентификаторы для сеток.

Вот почему я заполняю гирлянды в списке и сохраняю их в сеансе.

это мое событие checkedChange, связанное с флажками с AutoPostback = true в моей DataGrid1 (родительская сетка).

protected void Check_Change(object s, EventArgs ev)
    {
        ArrayList gridList = (ArrayList)Session["checkSession"];

        foreach (DataGridItem i in DataGrid1.Items)
        {
            string newSqlQuery = "SELECT S.staff_name FROM Staff as S where S.dep_code ='" + i.Cells[1].Text + "'";  

            CheckBox b = (CheckBox)i.Cells[2].Controls[1];

            if (b.Checked)
            {
                DataGrid dg = (DataGrid)gridList[0];

                foreach (DataGridItem item in dg.Items)
                {
                    CheckBox myBox = (CheckBox)item.Cells[0].Controls[0];
                    myBox.Checked = true;
                }
}
}
}

Это не сработало. Я отладил, мой список заполнен, у меня есть правильное количество данных, но флажок не изменен. Что мне не хватает ?? Мне нужно решить это так, чтобы я мог получить выбранные предметы и вставить их в свою базу данных. Я хочу знать, почему динамически сгенерированные dataGrids не могут быть изменены ??

Спасибо

1 Ответ

0 голосов
/ 11 июля 2011

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

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

это выглядело примерно так (извините, если это не удастся сделать из головы):

<asp:Repeater ...>
  <ItemTemplate>
    <tr>
    <td> ... </td>
    <td>
       <asp:Panel ..>
          <asp:GridView ...>
             ...
          </asp:GridView>
       </asp:Panel>
    </td>
    </tr>
  </ItemTemplate>
</asp:Repeater>

При загрузке страницы, если! IsPostback связывает повторитель. События On Row для элементов в строках репитера: 1. Переключить панель, видимую для этого ряда 2. получить данные 3. перейти к сетке в ряду. 4. сетка привязки данных

, чтобы получить разные виды, просто используйте разные панели в шаблоне элемента повторителя.

, кажется, работает хорошо и довольно эффективно.

Также: У меня есть дочерняя сетка в отдельном пользовательском элементе управления, чтобы сохранить код в чистоте и предотвратить массивные скопления кода в 1 коде позади файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...