我目前正在开发一个网站,其中一个页面需要在不同的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并且继续以我现在的方式工作?
下面的图片是我到目前为止所得到的。文件名上的是每个网格的主要标题

提前感谢您的帮助
发布于 2015-05-21 06:50:14
下面是一个使用嵌套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有一个除ItemType="WebFormsApp.Directory"以外的SelectMethod="GetDirectories"。方法是
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();
}希望代码是不言自明的
发布于 2015-05-21 04:27:44
如果是这样的话,只需使用嵌套的中继器。除非您确实需要GridView内置功能,如排序等。
https://stackoverflow.com/questions/30351700
复制相似问题