2010-11-09 17 views
0

我有問題,我無法獲得我在DataGrid中添加的控件。我將它添加在OnRowDataBound事件,如:asp:gridview不包含添加在OnRowDataBound中的控件

protected void RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit)) 
    { 
     //int cindex = 0; 
     //for (cindex = 0; cindex < e.Row.Controls.Count; cindex++) 
     foreach (Control ctl in e.Row.Controls) 
     { 
      DataControlFieldCell dcctl = (DataControlFieldCell)ctl; 
      TableCell tcell = (TableCell)dcctl; 

      Label lblComment = new Label(); 
      TextBox txtComment = new TextBox(); 

      lblComment.Text = "<br>Comment: "; 

      dcctl.Controls.Add(lblComment); 
      dcctl.Controls.Add(txtComment); 

      //tcell.Controls.Add(lblComment); 
      //tcell.Controls.Add(txtComment); 

      //e.Row.Cells[cindex].Controls.Add(lblComment); 
      //e.Row.Cells[cindex].Controls.Add(txtComment); 

這裏發生的事情:有一個已經存在默認情況下的TableCell一個文本框,我想再添一個文本框和標籤。在邊界後我可以看到2個文本框,我可以將數據輸入到兩個文本框中,但是當我單擊更新按鈕時,然後引發OnRowUpdating事件,因爲我無法獲取我的TextBox!

protected void RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     grdView.EditIndex = -1; 
     int counter = 0; 

     for (counter = 0; counter < grdView.Rows[e.RowIndex].Cells.Count; counter++) 
     { 
      foreach (Control ctl in grdView.Rows[e.RowIndex].Cells[counter].Controls) 
      { 

而在這裏,我將只獲取默認的一個文本框(與它的值)。但我的文本框消失了! :(

什麼你可以建議我來這裏做什麼?

PS我不能使用predifined列,就像在aspx文件asp:TemplateField,因爲我的表中有每一次不同的量行的,它是動態的

回答

0

我做到了!

拒絕在OnRowDataBound中動態添加控件,並創建了包含我需要的動態TempalteField列2個TextBoxes和Label。 (在http://www.codeproject.com/KB/aspnet/create_template_columns.aspx的幫助下)

但是在我的問題返回後.. OnRowUpdating事件仍然沒有添加我的TextBoxes。最後我在這裏發現通知http://forums.asp.net/p/1537632/3738331.aspx,它需要在Page_Load上實現TempalteField-s的添加,這有助於我解決問題!

0

問題是,當您動態地將控件添加到頁面(或任何頁面的子控件,如數據網格)後,必須在回發時重新創建服務器端的控件如果不重新創建控件在服務器端,然後當運行時處理回發它將不知道在哪裏把表單發佈內容。

所以,基本上當頁面處理回發時,它會看到名爲「gridView1_txtComment」的HTML字段(實際的HTML標識可能是別的東西,我知道)。但是服務器端代碼模型只有gridView1的實例,也沒有一個叫txtComment 文本框,除非運行RowDataBound方法再次創建控件的一個實例。

+0

我該如何再次運行RowDataBound?你能否描述更詳細的PLZ? – 2010-11-09 19:57:51

+0

您可能需要重新調整您添加這些控件的方式。我不能給你一個好的(簡單的)例子,因爲這個問題有點複雜。您必須瞭解的主要觀點是:在回發時,您負責_recreating_任何動態創建的控件,以便回發處理程序可以使用回髮結果填充它們。 – CodingGorilla 2010-11-10 13:06:35

0

我認爲它與ViewState有關。製作模板列,然後將第二個文本框添加到模板中。