2012-08-02 5 views
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: 
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); 

그런 다음 주문과 ea의 제목을 변경합니다. 채널 키, 만약 순서 < 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 

지금은 단순히 내가 지금 그것을 할 필요가

this.Session["documents"] = documentsTable; //Save to session for future use 
gvMail.DataSource = documentsTable; 
gvMail.DataBind(); 

모든 지금을 제외하고 잘 작동 DataTable의 및 바인딩

내있는 gridview의 데이터 소스 설정

사용자는 각 키를 편집하여 데이터베이스에 다시 저장할 수 있습니다. 일을 더 어렵게 만들려면 각 행을 editview에 넣을 때 텍스트 상자 또는 DropDownView가 필요합니다. (미래에는이 예제에서는 JavaScript를 사용하여 날짜 선택기를 만들지 만)

나는 내가 가지고있는 많은 문제의 커플은 내가 그것을 인 키 찾아서 유형을 찾기 위해 모든 키를 통해 코드를주기를 20 회 반복이 필요하다

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 
       // } 
     } 

과정을 반전 시도 . 나는에 의해 컨트롤을 추가 할 때

는 그 다음 문제는 다음과 같습니다

    TextBox txtBox = new TextBox(); 
        txtBox.Text = row.Cells[i].Text; 

        row.Cells[i].Controls.Add(txtBox); 

가 다시 게시 후 존재하지 않습니다 .. 당신이 텍스트 상자를 만들 수있는 DataGridView에 템플릿 열을 사용하지 않는 이유는

답변

0

및 DropDown 목록 열? 매우 간단하고 쉽고 다시 게시 한 후에 컨트롤을 지우는 문제를 해결할 것입니다.

+0

문제는 모든 사용자의 gridview가 다를 수 있습니다. 키 열의 포인트는 1이라는 사용자가 key1을 Date라는 날짜 열로 사용하기로 결정할 수 있습니다. 다른 사용자가 Key1을 열 이름 Counteries를 갖는 다중 선택으로 사용할 수 있습니다 – michael

관련 문제