2013-08-30 18 views
3

代碼添加GridView的列我有這顯示了有關某些文件的一些細節一個gridview。它有5列,包括一個包含複選框的模板字段。問題與從後面

從後面的代碼,OnInit中,我添加了一個號碼可能會或可能不會根據網頁上需要的附加信息欄。代碼如下:

for (int i = 0; i < models.Length && i < 3; i++) 
      { 
       var model = models[i]; 

       //Add gridview rows 
       BoundField bf = new BoundField(); 
       bf.DataField = "Attribute" + i; 
       bf.HeaderText = model.AttributeName; 
       bf.Visible = true; 

       gvFiles.Columns.Insert(6 + i, bf); 

      } 

這很好,我得到的列。在OnLoad事件中,我將某些數據綁定到gridview,並且工作正常。

的問題,當回發時上升。每當頁面創建一個回傳,它執行的OnInit,然後用這個(「上頁」)的錯誤消息崩潰:

出現了一個錯誤,因爲ID爲「ctl00 $搜索Maincontent $ gvFiles $ ctl02 $ ctl00」控制無法找到,或者在回發之後將其他控件分配給相同的ID。如果未分配ID,請顯式設置引發回發事件的控件的ID屬性以避免此錯誤。

我確定出現問題的控件是TemplateField中的複選框,我給它一個id。但是現在,在回發時會發生以下情況:

  1. 在TemplateFieldss複選框不會出現

  2. 其中 列是一個ImageField的,它失去了它的「控制風格 寬/高「參數和我得到巨大的圖像。

該問題只發生在回發,並刪除代碼,在文法上添加專業版的列,使一切工作完美。

我該如何得到這個工作?

+0

HTTP://www.codeproject。com/Questions/659792/Add-GridView-Column-Dynamically-ASP-Net –

+0

分享更多ASPX標記和代碼隱藏(你綁定GridView並分配模板的地方)。 – Mikhail

+0

做回發模型的數量變化嗎? – Clinton

回答

1

只要我說出一個在線解決方案

您需要添加的IsPostBack在你的頁面加載事件你的GridView綁定方法

中解釋:

見下面的代碼示例

PageLoad() 
{ 
BindGridview(); 
} 

Public void BindGridview() 
{ 
//Binding codes and add extra column codes 
for (int i = 0; i < models.Length && i < 3; i++) 
      { 
       var model = models[i]; 

       //Add gridview rows 
       BoundField bf = new BoundField(); 
       bf.DataField = "Attribute" + i; 
       bf.HeaderText = model.AttributeName; 
       bf.Visible = true; 

       gvFiles.Columns.Insert(6 + i, bf); 

      } 
} 

你所說的「BindGridview()」中被創造。同列字段每當你的頁面加載的頁面加載方法。

您需要在第一時間僅在頁面加載時調用「BindGridview()」方法。因此您需要!IsPostBack

請看下面的代碼|或在Page Init內部調用此事件

PageLoad() 
{ 
if(!IsPostBack) 
{ 
BindGridview(); 
} 
} 

Now BindGridview();方法稱爲頁面第一次加載。

More details about "IsPosteBack" property

+0

中執行所有這些操作,但不起作用。還是一樣的崩潰。在發生問題之前,它甚至無法訪問PageLoad。 – user2110845

+0

或者在OnInit事件中調用此函數 –

2

您需要重新創建一個頁面回傳動態添加的控制。

MSDN建議在PreInit事件中創建控件。

在開始階段完成後並且在初始化階段開始之前提出 階段。使用以下事件:

  • 檢查IsPostBack屬性以確定這是否是第一次處理頁面。此時,IsCallback和IsCrossPagePostBack屬性也已設置。
  • 創建或重新創建動態控件。
  • 動態設置母版頁。
  • 動態設置主題屬性。
  • 讀取或設置配置文件屬性值。
0

如果您的OnInit事件有一個if(!ispostback)然後將其刪除。動態控件只需在Oninit事件的每次回發時創建。

如果未重新創建控件,則無法找到控件,類似於您的情況。 如果在PageLoad上創建控件,那麼客戶端的值將不可訪問,您將得到不同的錯誤。

希望這會有所幫助。

0

複選框和圖像有問題導致css因錯誤而失敗。 您遇到的錯誤是,當你做回發時,已經與先前添加的數據行,所以要解決這個問題,你需要下面的代碼:

protected void Page_Init(object sender, EventArgs e) 
    { 


     if (Page.IsPostBack) 
     { 
     gvFiles.DataBind(); 

     } 

    } 
+0

這個問題與CSS完全沒有關係。 – geedubb

+0

當通常出現錯誤時,模板發生故障,這就是我所說的CSS。在這種情況下,當已經有內容的一行時,模板發生故障。 databind()清除並重新綁定gridview,因此即使你回發也不會有問題。 – 2013-12-13 04:31:55

+0

@geedubb請花些時間仔細閱讀答案。海報明確表示你的代碼中存在一個邏輯問題,它會打破頁面的顯示。 – TCB13

0

如果列數要添加在郵政後面是不同的初始負載,這可能是問題。特別是當視圖狀態試圖加載:

當添加動態控制c。根據一些條件有些家長控制P(即,在不加載它們對每一個頁面的訪問),您需要確定你將c添加到p的Controls集合的末尾。原因是因爲p的視圖狀態也包含p的子視圖的狀態,並且,正如我們將在「解析視圖狀態」一節中討論的,p的視圖狀態通過索引指定其子級的視圖狀態。 (圖5示出了如何插入動態控制某處比對照集合的末尾其它可引起損壞的視圖狀態。)

http://msdn.microsoft.com/en-us/library/ms972976.aspx