ユーザーのドキュメントを保持するデータベースがあります。ユーザーは、独自のメタデータを各ドキュメントに保存できます。これに対応するために、20 個の「キー」フィールドがあります。各ユーザーは、1 ~ 20 列を使用して名前を変更し、グリッドビューで好きなように並べ替えることができます。
ドキュメントテーブルは次のようになります
Documents:
ID int primary key identity,
SiteID int foreign key references sites(id),
PDFFolder varchar(100),
Key1 varchar(300),
keyN varchar(300); //Upto 20 keys
これで、KeyNames という別のテーブルができました。
KeyNames:
ID int primary key identity,
SiteId int foriegn key references sites(id),
KeyName1 varchar(50),
KeyOrder1 int, //1 is Textbox, 2 is Multi Choice, 3 is date ect
KeyType1 int,
KeyNameN varchar(50), //Repeat 20times
KeyOrderN int,
KeyTypeN int
私が使用している現在の方法は、特定のユーザー (サイトを所有しているユーザー) のドキュメントの DataTable を取得することです。
DataTable documents = GetDocuments(int userId, int siteId);
次に、各キーの順序と見出しを変更します。順序が < 0 の場合は削除されます
//Set Order of Keys
if ((keys.KeyOrder1 <0) || (keys.KeyOrder1 == null))
{
documentsTable.Columns.Remove("Key1");
}
else
{
documentsTable.Columns["Key1"].SetOrdinal((int)keys.KeyOrder1);
documentsTable.Columns["Key1"].ColumnName = keys.Keyname1;
}
//Repeat 20 times
ここで、グリッドビューのデータソースを DataTable と Bind に設定するだけです
this.Session["documents"] = documentsTable; //Save to session for future use
gvMail.DataSource = documentsTable;
gvMail.DataBind();
ユーザーが各キーを編集してデータベースに保存できるようにする必要があることを除いて、すべてうまくいきます。さらに難しくするために、各行が editview に配置されるときに、それを Textbox または DropDownView のいずれかにする必要があります (将来的には JavaScript を使用して日付ピッカーを作成しますが、この例では使用しません)。
私はプロセスを逆にしようとしました
protected void btnEdit_Click(Object sender, EventArgs e)
{
Button btn = sender as Button;
GridViewRow row = (GridViewRow)btn.NamingContainer;
if (btn.Text == "Edit")
{
for (int i = 0; i < row.Cells.Count; i++)
{
//Get Header
string header = gvMail.HeaderRow.Cells[i].Text;
//Get Keys
KeyName keys = db.GetKeys(SiteID);
//Cycle through keys to find right key
//ie if (keys.KeyName1 == header)
// {
// switch (keys.KeyType1)
{
case 1: //Add Textbox
case 2: //add drop down box code
// }
}
私が抱えている多くの問題のいくつかは、コードを 20 回繰り返して、すべてのキーを循環させて、どのキーであるかを見つけ、タイプを見つける必要があることです。
次の問題は、次の方法でコントロールを追加するときです。
TextBox txtBox = new TextBox();
txtBox.Text = row.Cells[i].Text;
row.Cells[i].Controls.Add(txtBox);
ポストバック後は存在しません。