2009-02-11 48 views
10

基本上,我希望我的對象回來...從我的GridView行獲取對象

我有一個Email對象。

public class Email{ 
    public string emailAddress; 
    public bool primary; 
    public int contactPoint; 
    public int databasePrimaryKey; 

    public Email(){} 
} 

在我的用戶控件中,我列出了Email對象。

public List<Email> EmailCollection; 

而我把它綁定到我的usercontrol裏面的GridView。

if(this.EmailCollection.Count > 0){ 
    this.GridView1.DataSource = EmailCollection; 
    this.GridView1.DataBind(); 
} 

這將是真正真棒,如果我能得到一個電子郵件對象返回出在GridView的以後。

我該怎麼做?

我也僅將一些Email對象的屬性綁定到GridView,並將它們放入項目模板中。

<Columns> 

<asp:TemplateField HeaderText="Email Address"> 
    <ItemTemplate> 
     <asp:TextBox ID="TextBox1" runat="server" Text=<%# Eval("EmailAddress") %> Width=250px /> 
    </ItemTemplate> 
</asp:TemplateField> 

<asp:TemplateField HeaderText="Primary"> 
    <ItemTemplate> 
     <asp:CheckBox runat="server" Checked=<%# Eval("PrimaryEmail") %> /> 
    </ItemTemplate> 
</asp:TemplateField> 

<asp:TemplateField HeaderText="Contact Point"> 
    <ItemTemplate> 
     <CRM:QualDropDown runat="server" Type=ContactPoint InitialValue=<%# Eval("ContactPoint") %> /> 
    </ItemTemplate> 
</asp:TemplateField> 

</Columns> 

GridView甚至可以這樣做嗎?我需要滾動我自己的東西嗎?如果它能爲我做到這一點真的很酷。


詳細說明。

我將List集合保存到viewstate中。

我最終想要了解的是,控件中會有一個Save按鈕,當事件觸發時,我想從GridView中的數據行創建一個Email對象,我的原始列表集合。然後如果有變化,那麼我會更新數據庫中的那一行。我在想,如果我可以將一個List集合放入一個GridView中,那麼也許我可以立即將它返回。

也許我爲我的Email對象創建一個新的構造函數,它需要一個DataRow?但是,然後有很多複雜性進入...

回答

3

那麼我結束了我的列表EmailCollection,它被保存到ViewState循環。

所以在頁面中單擊一個保存按鈕,當事件被捕獲時,我遍歷我的List Collection並通過索引從GridView中獲取行。我不得不使用GridView1.Rows [i] .Cells [j] .FindControl(「myControl1」),然後從它獲得適當的值名單。

我確實看到一個GridViewRow對象有一個DataItem屬性,它包含我的Email對象,但它僅在RowBound階段可用。

不幸的是,如果/當我需要在稍後擴展此電子郵件收集時,通過添加或刪除列,它將需要幾個步驟。

protected void SaveButton_OnClick(object sender, EventArgs e){ 
    for (int i = 0; i < this.EmailCollection.Count; i++) 
    { 
     Email email = this.EmailCollection[i]; 
     GridViewRow row = this.GridView1.Rows[i]; 

     string gv_emailAddress = ((TextBox)row.Cells[0].FindControl("EmailAddress")).Text; 
     if (email.EmailAddress != gv_emailAddress) 
     { 
      email.EmailAddress = gv_emailAddress; 
      email.Updated = true; 
     } 
     ... 
    } 
} 

我仍然對更有效的解決方案開放。

5

ASP.NET Databinding在對象操作方面是單向操作。然而,DataSource屬性將包含整個響應您EmailCollection參考:

EmailCollection col = (EmailCollection)this.GridView1.DataSource; 

但我有一種感覺,你真正想要的是一個基於用戶輸入操縱你的EmailCollection控制,並在檢索下一個請求。甚至連webforms都不能僞造這種有狀態的開箱即用。

0

如果你想要保持這樣一個對象最容易使用視圖狀態,雖然你會複製數據,但對於一個小對象應該沒問題。

ViewState.Add("EmailObj", Email); 

EMail email = (Email)ViewState["EmailObj"]; 
0

只是一個想法,基本上是滾動你自己的,但不是非常棘手的事情:

商店,你作爲視圖狀態或會話的數據源使用列表,並有一個隱藏字段在GridView成爲與該行匹配的對象的索引或鍵。

換句話說,gridview中的每一行都「知道」它所基於的列表中的哪個電子郵件對象。