0

我有一个保存用户文档的数据库。用户可以将自己的元数据存储到每个文档中,为此我有 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);

回发后它不存在..

4

1 回答 1

0

为什么不使用 DataGridView 中的模板列来创建 TextBox 和 DropDown 列表列?它非常简单易行,将解决您在回发后清除控件的问题。

于 2012-08-02T04:24:47.780 回答