我想创建一个显示 PDF 文件记录的 GridView。这些记录可以附加用户可自定义的元数据,因此他们可以创建自己的列并在其中输入自己的信息。然后我希望它显示在 GridView 中,因此如果列顺序为 -1,他们可以对每一列和列顺序进行排序,它将不会显示在 GridView 中。
例如有一个静态表
DocumentsTable:
ID int
PDF_Folder varchar
UserID int
然后还有另一个表,用户可以为其创建自己的列
MetaDataColumns:
ID int
userid int foreign key
KeyName varchar
Order int
和保存值的表
MetaDataValues:
ID int
UserID int foreign key
DocumentID int foreign key
MetaDataID int foreign key
value varchar(100)
现在的问题是我需要从 MetaDataColumn 获取列来创建 GridView,然后用 MetaDataValue 表中的值填充它。我最初的计划是拥有一个动态创建 GridView 并向其添加列的函数,但是我坚持如何将 MetaDataValue 中的值用作列。或者,我可以只使用 GridView AutoGenerate 列,但我需要自定义 SQL 以显示自定义数据。我有点坚持如何解决这个问题。
我想出的一种方法是这个伪代码:
private DataTable CreateColumns()
{
var columns = select * from MetaDataColumns
where userid = UserId;
DataTable dt = new DataTable();
foreach (column in columns)
{
dt.Columns.Add(new DataColumn(column[keyName], typeof(string)); //assumes all string
}
return dt
}
private void PopulateDG(DataGrid dg)
{
var documents = select * from DocumentsTable
where userid=UserId;
foreach (document in documents)
{
var columnValues = select * from MetaDatavalues
documentID == document.id;
DataRow dr = dg.NewRow();
dr[columnValues.KeyName] = columnValues.value;
}
}
private void LoadGV()
{
DataGrid dg = CreateColumns();
PopulateDG(dg);
GridView.datasource = dg;
GridView.DataBind();
}
我不喜欢这种设计的一件事是它为文档表中的每一行创建另一个查询。我不确定这是否是 SQL 的问题?