2011-05-26 32 views
0

之前,我有我想RowCommand執行RowCreate重裝或像這樣

<asp:GridView> 
<asp:TemplateField HeaderText="PsyHealth"> 
    <ItemTemplate> 
     <asp:PlaceHolder runat="server" ID="PsyHealth" /> 
    </ItemTemplate> 
</asp:TemplateField> 
<asp:TemplateField HeaderText="-"> 
    <ItemTemplate> 
    <asp:LinkButton ID="Gen" CommandName="Gen" runat="server" Text="gen" /> 
    </ItemTemplate> 
</asp:TemplateField> 

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     var dataItem = e.Row.DataItem as ViewModels.UserTestorViewModel; 
     var psyHealth = e.Row.FindControl("PsyHealth") as PlaceHolder; 
     if (psyHealth != null) 
     { 
      psyHealth.Controls.Add(dataItem.PsyHeath); 
     } 
    } 
} 
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    //bla bla bla 
} 

,但是當我點擊頁面上的GenLinkButtonGridView1_RowCreated首先被觸發並拋出錯誤Object reference not set to an instance of an object,因爲e.Row.DataItem爲空。

編輯:代碼

protected void Page_Load(object sender, EventArgs e) 
{ 
    List<ViewModels.UserTestorViewModel> utViewModelList = new List<ViewModels.UserTestorViewModel> { }; 

    utViewModelList = utRepo.GetUserTestorViewModelListByHrId(); 

    this.GridView1.DataSource = utViewModelList; 
    this.GridView1.DataBind(); 

    if (!IsPostBack) 
    { 
    } 
} 

protected void Page_Init(object sender, EventArgs e) 
{ 
    GridView1.RowCreated += new GridViewRowEventHandler(GridView1_RowCreated); 
} 
+0

你可以發佈你的RowCreated代碼?如果您將完整的表單和代碼放在後面,會更好。 – 2011-05-26 08:55:21

+0

我更新了關於'GridView1_RowCreated'的帖子。 'GridView1_RowCommand'沒有代碼,問題是我永遠不會跑到那裏。 – hbrls 2011-05-26 09:05:11

+0

你可以確定,你的gridview在rebback上回發嗎? – 2011-05-26 09:06:22

回答

0

當您單擊GridView中的任一按鈕的背後,您的網頁postbacked並進入RowCommand事件之前被稱爲頁面加載事件。在頁面加載事件中,您將再次綁定您的gridview,這就是爲什麼您的RowCreated Event被調用。

你有你的GridView綁定下if (!IsPostBack)

protected void Page_Load(object sender, EventArgs e) 
{ 

if (!IsPostBack) 
{ 
    List<ViewModels.UserTestorViewModel> utViewModelList = new List<ViewModels.UserTestorViewModel> { }; 

utViewModelList = utRepo.GetUserTestorViewModelListByHrId(); 

this.GridView1.DataSource = utViewModelList; 
this.GridView1.DataBind(); 
    } 
} 

編輯:現在我得到了你的問題,您發佈的代碼後..

的問題是在這裏Page_Init,你可以刪除事件處理器並嘗試以下操作:

protected void Page_Init(object sender, EventArgs e) 
{ 
    GridView1.RowCreated += new GridViewRowEventHandler(GridView1_RowCreated); 
} 

add here

<asp:GridView onrowcreated="GridView1_RowCreated"> 
+0

不起作用。全部保持不變。它遇到'RowCreate'並死亡。 – hbrls 2011-05-26 10:14:25

+0

然後在您創建的行事件中必定存在問題。 – 2011-05-26 10:21:41

+0

已更新的答案並立即嘗試。 – 2011-05-26 10:43:31

0

你可以在會話第一次存儲utViewModelList嗎?如果是這樣,那麼您可以通過所選行的DataKey值保存UserTestorViewModel實例。

+0

這可能非常大。它會影響性能嗎? – hbrls 2011-05-26 12:03:01

+0

這取決於你存儲會話的位置。如果它存儲在數據庫中,那麼是的,它會影響性能。如果它存儲了InProc,那麼你寧願浪費內存,但性能會受到一些影響。實際上,您只能將實體ID與標籤實例一起存儲,而不是實體。 – 2011-05-26 13:05:58

相關問題