使用多个 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
.
的简单粗暴示例
这里我用了两个类Directory
和DirectoryFile
.
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();
}
希望代码是不言自明的
我目前正在一个网站上工作,其中一个页面需要在不同的 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
.
这里我用了两个类Directory
和DirectoryFile
.
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();
}
希望代码是不言自明的