Dynamiczne tworzenie GridView

Chcę utworzyć GridView, który wyświetla rekordy dla plików PDF. Te rekordy mogą mieć dołączone metadane, które użytkownik może dostosować, aby mogły tworzyć własne kolumny i wprowadzać tam swoje własne informacje. Następnie chcę, aby była wyświetlana w GridView, aby mogli zamówić każdą kolumnę i kolejność kolumn, jeśli kolejność kolumn wynosi -1, nie będzie wyświetlana w GridView.

Na przykład istnieje statyczna tabela

DocumentsTable:
ID int
PDF_Folder varchar
UserID int

Następnie jest inna tabela, w której użytkownicy mogą tworzyć własne kolumny

MetaDataColumns:
ID int
userid int foreign key
KeyName varchar
Order int

i stół do przechowywania wartości

MetaDataValues:
ID int
UserID int foreign key
DocumentID int foreign key
MetaDataID int foreign key
value varchar(100)

Teraz problemem jest, aby uzyskać kolumny z MetaDataColumn, aby utworzyć GridView, a następnie wypełnić go wartościami w tabeli MetaDataValue. Moim pierwotnym planem jest funkcja, która dynamicznie tworzy GridView i dodaje do niego kolumny, jednak utknąłem na tym, jak używać wartości w MetaDataValue jako kolumn. Alternatywnie mógłbym mieć kolumny GridView AutoGenerate, ale muszę dostosować SQL, aby wyświetlić dane niestandardowe. Trochę się utknąłem, jak się do tego zbliżyć.

Jedno podejście, które wymyśliłem, to ten pseudo kod:

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();
  }

Jedną z rzeczy, które nie podoba mi się w tym projekcie, jest dla każdego wiersza w tabeli dokumentów tworzy kolejne zapytanie. Nie jestem pewien, czy jest to problem z SQL?

questionAnswers(3)

yourAnswerToTheQuestion