ASP.NET - Expand-Collapse feature in gridview

Asked By Xor Power on 25-Jul-11 01:41 AM

I have asp.net default gridview in VS 2008. Now if i a click history column, i need to expand column (by clicking right arrow '>') and beneath display the necessary data. It should be collapse when clicking the right arrow again.

One way is using Collpasble Panel of AJAX and other (not sure) is div. But i am not sure how to use either of them inside gridview satisfying the requirement as mentioned above.

Please help me! Let me know if any query.

Bala Marish replied to Xor Power on 25-Jul-11 01:44 AM
refer the following code


<asp:GridView ID="gvTab" BackColor="WhiteSmoke" runat="server"
   AutoGenerateColumns="False" GridLines="Vertical" ShowFooter="True">
   <Columns>
    <asp:TemplateField>
     <HeaderStyle Width="25px" />
     <ItemStyle Width="25px" BackColor="White" />
     <HeaderTemplate>
        <asp:Image ID="imgTab" onclick="javascript:Toggle(this);"
         runat="server" ImageUrl="~/minus.gif" ToolTip="Collapse" />
     </HeaderTemplate>
    </asp:TemplateField>
    <asp:BoundField HeaderText="n" DataField="n">
     <HeaderStyle Width="25px" />
     <ItemStyle Width="25px" />
    </asp:BoundField>
    <asp:BoundField HeaderText="sqrt(n)" DataField="sqrtn">
     <HeaderStyle Width="150px" />
     <ItemStyle Width="150px" />
    </asp:BoundField>
    <asp:BoundField HeaderText="qbrt(n)" DataField="qbrtn">
     <HeaderStyle Width="150px" />
     <ItemStyle Width="150px" />
    </asp:BoundField>
   </Columns>
   <HeaderStyle Height="25px" Font-Bold="True" BackColor="DimGray"
          ForeColor="White" HorizontalAlign="Center"
          VerticalAlign="Middle" />
   <RowStyle Height="25px" BackColor="Gainsboro"
       HorizontalAlign="Center" VerticalAlign="Middle" />
   <AlternatingRowStyle Height="25px" BackColor="LightGray"
       HorizontalAlign="Center" VerticalAlign="Middle" />
   <FooterStyle BackColor="Gray" />
</asp:GridView
>


<script type="text/javascript">
var Grid = null;
var UpperBound = 0;
var LowerBound = 1;
var CollapseImage = 'minus.gif';
var ExpandImage = 'plus.gif';
var IsExpanded = true;  
var Rows = null;
var n = 1;
var TimeSpan = 25;
     
window.onload = function()
{
    Grid = document.getElementById('<%= this.gvTab.ClientID %>');
    UpperBound = parseInt('<%= this.gvTab.Rows.Count %>');
    Rows = Grid.getElementsByTagName('tr');
}
     
function Toggle(Image)
{
    ToggleImage(Image);
    ToggleRows(); 
}   
     
function ToggleImage(Image)
{
    if(IsExpanded)
    {
     Image.src = ExpandImage;
     Image.title = 'Expand';
     Grid.rules = 'none';
     n = LowerBound;
      
     IsExpanded = false;
    }
    else
    {
     Image.src = CollapseImage;
     Image.title = 'Collapse';
     Grid.rules = 'cols';
     n = UpperBound;
         
     IsExpanded = true;
    }
}
     
function ToggleRows()
{
    if (n < LowerBound || n > UpperBound)  return;
               
    Rows[n].style.display = Rows[n].style.display == '' ? 'none' : '';
    if(IsExpanded) n--; else n++;
    setTimeout("ToggleRows()",TimeSpan);
}
</script>


also refer the following site
http://www.codeproject.com/KB/webforms/GridViewExpandCollapse.aspx
Ravi S replied to Xor Power on 25-Jul-11 01:56 AM
HI

<script type="text/javascript">
 var Grid = null;
 var UpperBound = 0;
 var LowerBound = 1;
 var CollapseImage = 'minus.gif';
 var ExpandImage = 'plus.gif';
 var IsExpanded = true;   
 var Rows = null;
 var n = 1;
 var TimeSpan = 25;
 window.onload = function()
 {
    Grid = document.getElementById('<%= this.gvTab.ClientID %>');
    UpperBound = parseInt('<%= this.gvTab.Rows.Count %>');
    Rows = Grid.getElementsByTagName('tr');
 }
 function Toggle(Image)
 {
    ToggleImage(Image);
    ToggleRows();  
 }    
 function ToggleImage(Image)
 {
    if(IsExpanded)
    {
       Image.src = ExpandImage;
       Image.title = 'Expand';
       Grid.rules = 'none';
       n = LowerBound;
       IsExpanded = false;
    }
    else
    {
       Image.src = CollapseImage;
       Image.title = 'Collapse';
       Grid.rules = 'cols';
       n = UpperBound;
       IsExpanded = true;
    }
 }
 function ToggleRows()
 {
    if (n < LowerBound || n > UpperBound)  return;
    Rows[n].style.display = Rows[n].style.display == '' ? 'none' : '';
    if(IsExpanded) n--; else n++;
    setTimeout("ToggleRows()",TimeSpan);
 }
</script>

http://www.codeproject.com/KB/webforms/GridViewExpandCollapse/GridViewExpandCollapse.zip

preview.gif


refer the link
http://www.codeproject.com/KB/webforms/GridViewExpandCollapse.aspx
Ravi S replied to Xor Power on 25-Jul-11 01:58 AM
HI

try this

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MyWinFormSample
{
    public partial class Form7 : Form
    {
        public Form7()
        {
            InitializeComponent();
            this.detailControl = new DetailUserControl { Visible = false };
            this.detailControl.BackColor = Color.Yellow;
            this.Controls.Add(detailControl);
            this.Controls.SetChildIndex(detailControl, 0);
        }
        private UserControl detailControl;
        private void Form7_Load(object sender, EventArgs e)
        {
            DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
            col.DefaultCellStyle.NullValue = "+";
            col.HeaderText = "";
            col.Width = 30;
            col.ReadOnly = true;
            col.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            this.dataGridView1.Columns.Add(col);
            this.dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick);
        }
        void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                if (this.dataGridView1[e.ColumnIndex, e.RowIndex].Value == null)
                    this.dataGridView1[e.ColumnIndex, e.RowIndex].Value = "+";
                if (this.dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString().Trim() == "+")
                {
                    //Rebound the detail form to show new data.
                    var cellBounds = this.dataGridView1.GetCellDisplayRectangle(e.ColumnIndex,e.RowIndex,false);
                    var offsetLocation = new Point(cellBounds.X, cellBounds.Y + cellBounds.Height);
                    offsetLocation.Offset(this.dataGridView1.Location);
                    detailControl.Location = offsetLocation;
                    detailControl.Show();
                    this.dataGridView1[e.ColumnIndex, e.RowIndex].Value = "-";
                }
                else
                {
                    detailControl.Hide();
                    this.dataGridView1[e.ColumnIndex, e.RowIndex].Value = "+";
                }
            }
        }
    }
}
Let me know if this does not help.

refer the links also
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/338a7dbc-20ba-4304-8d48-b6774626210c/
http://www.codehighstreet.com/articles/toggle_gridview_columns/toggle_gridview_columns.aspx
dipa ahuja replied to Xor Power on 25-Jul-11 03:35 AM
If you want to expand collapse data of column then you can use the jquery this way:

<script src="jquery-1.4.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
  $(document).ready(function () {
    //when page load hide the detail
      $('p#PknwMore').hide();
      //when click on know more display detail
    $('a#a1').click(function () {
        $('p#PknwMore').slideDown();
      //.show('slow');
    });
    //when click on read less hide the detail
    $('a#aHide').click(function () {
      $('p#PknwMore').slideUp();
      //.hide('slow');
    });
  });  
</script>
<ItemTemplate>
<a href="#" id="a1">Read History</a>
<p id="PknwMore">
  <asp:Label ID="lblMaritalstatus" runat="server" Text='<%#Eval("history") %>' />
  <a id="aHide" href="#">Read History</a>
</p>
</ItemTemplate>
hope this will help you!