我有一个保存用户文档的数据库。用户可以将自己的元数据存储到每个文档中,为此我有 20 个“关键”字段。每个用户可以使用 1 到 20 列,并根据需要在 gridview 中重命名和排序。
文档表如下所示
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
现在我只需将我的 gridview 的数据源设置为 DataTable 并绑定
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);
回发后它不存在..