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をカスタマイズする必要があります。私はこれにアプローチする方法に少し立ち往生しています。
私が思いついたアプローチの1つは、この擬似コードです。
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();
}
このデザインについて私が気に入らないことの1つは、ドキュメントテーブルのすべての行に対して別のクエリを作成することです。これがSQLの問題かどうかわかりませんか?