65.9K
CodeProject 正在变化。 阅读更多。
Home

展开/折叠 GridView 行

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (49投票s)

2008年5月7日

CPOL

1分钟阅读

viewsIcon

308254

downloadIcon

3233

本文档描述了如何使用 JavaScript 展开和折叠 GridView 的行。

preview.gif

引言

本文档展示了使用 JavaScript 实现 GridView 行的展开/折叠功能。为了演示此功能,我在 GridView 标题上使用了一个 Image。单击此 Image 时,GridView 的行将连续展开和折叠。

使用 HTML 代码

GridView 内部添加一个 TemplateField,并在 TemplateFieldHeaderTemplate 中放置一个 ImageGridView 的 HTML 代码如下所示

<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>

将一个 onclick 事件附加到 GridView 标题的 Image

<asp:Image ID="imgTab" onclick="javascript:Toggle(this);" runat="server" 
           ImageUrl="~/minus.gif" ToolTip="Collapse" />

使用 JavaScript 代码

将以下代码放入 script 标签中

<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>

在上面的代码中,全局变量在 window.onload 事件中初始化。有三种方法:ToggleToggleImageToggleImageToggle 方法在单击标题图像时被调用。此方法首先切换标题图像,然后通过调用 ToggleImageToggleImage 方法切换 GridView 的行。请注意,ToggleRows 方法在这里递归调用,使用 setTimeout 方法。我在这里递归调用它是为了在 GridView 行展开/折叠期间创建一个**动态效果**。

为了在每次递归中产生延迟,每次调用 ToggleRows 方法都会延迟 25 毫秒。您可以根据需要通过更改 TimeSpan 值来更改它。

结论

在本文档中,我使用了 setTimeout 方法来实现平滑的展开/折叠功能。

我已在以下浏览器上测试了此脚本

Browsers.png

© . All rights reserved.