您没有提到上传文件的人员表是否与应该驱动网格的表不同。
如果是出于某种原因,则构建一个不包含文件列的 group by 查询,然后 group by,这样您就可以为每个员工提供一个 SINGLE 行。
那么,我们可以把这个放到一个网格列表中:
我将使用列表框代替组合(下拉菜单),因此它会很好地显示文件 - 如果需要,您可以将其更改为下拉菜单 - 相同的代码
所以,标记可能是这样的:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ID" CssClass="table table-hover" OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="Firstname" HeaderText="First Name" />
<asp:BoundField DataField="LastName" HeaderText="Last Name" />
<asp:BoundField DataField="TrainingDate" HeaderText="Training Date" DataFormatString="{0:yyyy-MM-dd}" />
<asp:BoundField DataField="ApplicationDate" HeaderText="Application Date" DataFormatString="{0:yyyy-MM-dd}" />
<asp:BoundField DataField="ProgramTitle" HeaderText="Program Title" />
<asp:BoundField DataField="TrainingCost" HeaderText="Training Cost" DataFormatString="{0:c}" />
<asp:TemplateField HeaderText="Documents Submitted">
<ItemTemplate>
<asp:ListBox ID="cboFiles" runat="server" Width="200PX"
DataTextField ="FileName"
DataValueField="FileName">
</asp:ListBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
请注意我们如何添加列表框(如上所述,如果需要,请使用下拉菜单)。
因此,填充此 gv 的代码将是这样的:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadGrid();
}
void LoadGrid()
{
GridView1.DataSource = MyRst("SELECT * from Users ORDER BY FirstName");
GridView1.DataBind();
}
DataTable MyRst(string strSQL)
{
DataTable rstData = new DataTable();
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
rstData.Load(cmdSQL.ExecuteReader());
}
}
return rstData;
}
但是,对于每一行,我们都需要加载该行的文件列表。如前所述,我不知道您这里是否有两张桌子 - 或一张。 (但是,这真的没关系 - 如上所述,对这个主网格数据源使用 group-by。
现在,唯一额外的部分是使用 gv “行数据绑定”事件。这会在渲染期间为每一行触发,并且是加载组合框或列表框的想法事件。
代码是这样的:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
// get PK row id (user id)
int? PKID = GridView1.DataKeys[e.Row.RowIndex]["ID"] as int?;
string strSQL = "SELECT FileName FROM MyFiles WHERE User_ID = " + PKID;
DataTable rstFiles = MyRst(strSQL);
ListBox cboFiles = e.Row.FindControl("cboFiles") as ListBox;
cboFiles.DataSource = rstFiles;
cboFiles.DataBind();
cboFiles.Rows = 1;
if (rstFiles.Rows.Count > 1)
cboFiles.Rows = rstFiles.Rows.Count;
}
}
上面我确实有两列。一列是 JUST 文件名,一列是上传文件夹的完整路径名 + 文件。如果您不只有一个文件名列,那么我们可以编写一些代码来只包含 + 显示文件名。
运行上面的结果是这样的: