0

ユーザーのドキュメントを保持するデータベースがあります。ユーザーは、独自のメタデータを各ドキュメントに保存できます。これに対応するために、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);

ポストバック後は存在しません。

4

1 に答える 1

0

TextBox と DropDown リストの列を作成するために、DataGridView の Template Columns を使用しないのはなぜですか? これは非常にシンプルで簡単で、ポストバック後にコントロールをクリアするという問題を解決します。

于 2012-08-02T04:24:47.780 に答える