使用多个 GridView

Using Multiple GridViews

我目前正在一个网站上工作,其中一个页面需要在不同的 GridView 中显示数据。该页面看起来像

<h2>First Header</h2>
<p>Some text</p>
<asp:GridView ID="FirstGrid" runat="server"/>
...
<h2>Second Header</h2>
<p>Some text</p>
<asp:GridView ID="SecondGrid" runat="server"/>
...
<h2>Third Header</h2>
<p>Some text</p>
<asp:GridView ID="ThirdGrid" runat="server"/>
...

我总共会有 6-7 个 Gridviews。每个网格显示来自不同目录的文件。目前我有一个函数 BindGridView(string directoryName) 并且我为每个网格执行以下操作 DataSource

FirstGrid.DataSource = BindGridView("First Directory");
FirstGrid.DataBind();
SecondGrid.DataSource = BindGridView("Second Directory");
SecondGrid.DataBind();
...

我的问题是我可以拥有一个 Gridview 并更改 DataSource 还是我需要全部 6-7 并继续我现在的工作方式。

下图是我目前所拥有的。文件名上方是每个网格

的主要header

提前感谢您的帮助

如果是这种情况,只需使用嵌套中继器即可。除非你真的需要 GridView 的内置功能,比如排序等

这是一个使用嵌套 ListView.

的简单粗暴示例

这里我用了两个类DirectoryDirectoryFile.

namespace WebFormsApp
{
    public class Directory
    {
        // the directory names like First Directory
        public string DirectoryName { get; set; }
        // the content that comes under header tag
        public string HeaderText { get; set; }
        // the content that comes under p tag
        public string InfoText { get; set; }
    }
    public class DirectoryFile
    {
        // file name
        public string FileName { get; set; }
        // download url
        public string Url { get; set; }
    }
}

标记应该类似于

<asp:ListView ID="DirectoryList" runat="server" 
    ItemType="WebFormsApp.Directory" 
    SelectMethod="GetDirectories"
    OnItemDataBound="DirectoryList_ItemDataBound">   
    <ItemTemplate>
        <h2><%# Item.HeaderText %></h2>
        <p><%# Item.InfoText %></p>
        <asp:ListView ID="FileList" runat="server" 
            DataMember='<%# Item.DirectoryName %>' 
            ItemType="WebFormsApp.DirectoryFile">
            <LayoutTemplate>
                <table>
                    <thead>
                        <tr>
                            <th>File Name</th>
                            <th>Download</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr id="itemPlaceHolder" runat="server"></tr>
                    </tbody>
                </table>
            </LayoutTemplate>
            <ItemTemplate>
                <tr>
                    <td><%# Item.FileName %></td>
                    <td><%# Item.Url %></td>
                </tr>
            </ItemTemplate>
        </asp:ListView>
    </ItemTemplate>
</asp:ListView>

这里的父 ListView 有一个 SelectMethod="GetDirectories" 除了 ItemType="WebFormsApp.Directory"。该方法将是

public List<Directory> GetDirectories()
{
    //assuming it will be a not populated from database. 
    // if so change your code accordingly
    var directories = new List<Directory>()
        {
            new Directory {DirectoryName="FirstDirectory", HeaderText="First Header", InfoText="Some Info"},
            new Directory {DirectoryName="SecondDirectory", HeaderText="Second Header", InfoText="Other Info"}
        };
    return directories;
}

最后连接一个 ItemDataBound 方法(它遍历每个项目)并找到子 ListView。请看我们提供了一个 DataMember='<%# Item.DirectoryName %>' 以便我们可以在代码隐藏中访问它。

protected void DirectoryList_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        var listView = (ListView)e.Item.FindControl("FileList");
        var directoryName = listView.DataMember;
        GetFiles(listView, directoryName);
    }
}
public void GetFiles(ListView listView, string directoryName)
{

    listView.DataSource = BindChildlistView(directoryName);
    listView.DataBind();
}

希望代码是不言自明的