2009-02-11 12 views
10

Zasadniczo chcę odzyskać mój obiekt ...Uzyskiwanie obiektu z powrotem z moich wierszy GridView

Mam obiekt poczty elektronicznej.

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

    public Email(){} 
} 

W moim kontrolerze użytkownika, i liście obiektów e-mail.

public List<Email> EmailCollection; 

I wiążę to do GridView wewnątrz mojej kontroli użytkownika.

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

Byłoby naprawdę super, gdybym mógł uzyskać obiekt email z powrotem się z GridView później.

Jak to zrobić?

Łączę również niektóre właściwości obiektu poczty elektronicznej z GridView i są one umieszczane w szablonach elementów.

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

Czy GridView może to zrobić? Czy muszę przetaczać własne rzeczy? Byłoby naprawdę fajnie, gdyby to zrobił dla mnie.


Aby opracować więcej.

Zapisuję kolekcję List do stanu widoku.

Do czego w końcu próbuję się dostać, jest przycisk Zapisz gdzieś w sterowaniu, który po uruchomieniu zdarzenia chciałbym utworzyć obiekt Email z pliku danych w GridView, który można porównać do moja oryginalna kolekcja List. Jeśli pojawi się zmiana, zaktualizuję ten wiersz w bazie danych. Pomyślałem, że gdybym mógł umieścić kolekcję List w GridView, to prawdopodobnie mógłbym to naprawić.

Być może mogę utworzyć nowy konstruktor dla mojego obiektu Email, który pobiera DataRow? Ale istnieje wiele komplikacji, które się w to mieszczą ...

Odpowiedz

3

Cóż, skończyło się na zapętleniu mojej listy EmailCollection, która została zapisana w ViewState.

Tak więc na stronie kliknięto przycisk Zapisz, gdy wydarzenie zostanie przechwycone, przechodzę przez moją kolekcję list i pobieram wiersz z widoku GridView według indeksu.

Na GridViewRow muszę użyć GridView1.Rows [i] .Cells [j] .FindControl ("myControl1"), a następnie uzyskać odpowiednią wartość z niego, czy to pole wyboru, pole tekstowe lub rozwijane lista.

Widzę, że obiekt GridViewRow ma właściwość DataItem, która zawiera mój obiekt Email, ale jest dostępna tylko podczas fazy RowBound.

Niestety Jeśli/Kiedy muszę rozwinąć później tę kolekcję wiadomości e-mail, dodając lub usuwając kolumny, zajmie to kilka kroków.

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; 
     } 
     ... 
    } 
} 

Byłbym nadal otwarty na bardziej wydajne rozwiązania.

5

Tworzenie wiązań ASP.NET jest operacją jednokierunkową w zakresie manipulacji obiektami. Jednakże, właściwość DataSource będą zawierać odniesienie do swojej EmailCollection całym odpowiedzi:

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

Ale mam wrażenie, że to, co naprawdę chcesz to kontrola, która manipuluje swoją EmailCollection na podstawie danych wprowadzonych przez użytkownika i odzyskać w następna prośba. Nawet webformy nie podrabiają tego rodzaju statefulness po wyjęciu z pudełka.

0

Jeśli chcesz zatrzymać się na takim obiekcie, najprościej będzie użyć stanu widoku, chociaż będziesz duplikował dane, ale dla małego obiektu powinno być w porządku.

ViewState.Add("EmailObj", Email); 

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

Tylko myśl, w zasadzie przewróceniu własne, ale nie tak trudne do zrobienia:

Store wykaz, który służy jako źródło danych w stan wyświetlania lub sesji, mają ukryte pole w gridview być indeksem lub kluczem do obiektu pasującego do wiersza.

Innymi słowy, każdy wiersz w gridview "wie", który obiekt poczty elektronicznej znajduje się na liście, na której jest oparty.