2009-02-11 15 views
10

Grundsätzlich möchte ich mein Objekt zurück ...Ein Objekt aus meinen GridView-Zeilen zurückholen

Ich habe ein E-Mail-Objekt.

In meiner Benutzerverwaltung, ich eine Liste von E-Mail-Objekten.

Und ich verbinde dies mit einem GridView innerhalb meiner Benutzersteuerung

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

Es wäre wirklich genial, wenn ich aus des Gridview später wieder ein E-Mail-Objekt zu bekommen.

Wie mache ich das?

Ich bin auch nur einige der Eigenschaften des E-Mail-Objekts an die GridView binden und sie werden in Artikelvorlagen eingefügt.

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

Kann GridView das auch tun? Muss ich mein eigenes Ding rollen? Es wäre wirklich cool, wenn es das für mich tun würde.


Um mehr zu erarbeiten.

Ich speichere die List-Auflistung in den Viewstatus.

Was ich schließlich versuche zu erreichen, ist, dass es irgendwo im Steuerelement eine Schaltfläche Speichern gibt, die wenn das Ereignis ausgelöst wird, möchte ich ein E-Mail-Objekt aus einem Datarow in GridView erstellen, mit dem zu vergleichen meine ursprüngliche Liste Sammlung. Wenn es eine Änderung gibt, würde ich diese Zeile in der Datenbank aktualisieren. Ich dachte, wenn ich eine List-Sammlung in eine GridView-Datei einfügen könnte, könnte ich sie vielleicht gleich wieder zurückbekommen.

Vielleicht erstelle ich einen neuen Konstruktor für mein E-Mail-Objekt, die eine DataRow nimmt? Aber dann gibt es eine Menge Komplexität, die in das ...

Antwort

3

Nun endete ich mit dem Durchlaufen meiner Liste EmailCollection, die in ViewState gespeichert wurde.

Also auf der Seite ist eine Schaltfläche zum Speichern angeklickt, wenn das Ereignis abgefangen wird, ich meine Liste Sammlung durchlaufen und die Zeile aus der GridView nach Index.

Auf der GridViewRow muss ich eine GridView1.Rows [i] .Cells [j] .FindControl ("myControl1") dann erhalten Sie den entsprechenden Wert davon, sei es ein Kontrollkästchen, Textfeld oder Dropdown Liste.

Ich sehe, dass ein GridViewRow-Objekt eine DataItem-Eigenschaft hat, die mein E-Mail-Objekt enthält, aber es ist nur während der RowBound-Phase verfügbar.

Leider Wenn/Wenn ich später auf diese E-Mail-Sammlung erweitern möchte, indem ich Spalten hinzufüge oder entferne, dauert es ein paar Schritte.

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

Ich wäre immer noch offen für effizientere Lösungen.

5

ASP.NET Databinding ist eine einseitige Operation in Bezug auf die Objektbearbeitung. Allerdings wird die Datasource-Eigenschaft einen Verweis auf Ihre EmailCollection im gesamten Antwort enthalten:

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

Aber ich habe das Gefühl, dass das, was Sie wirklich wollen, ist ein Steuerelement, das Ihre EmailCollection manipuliert basierend auf Benutzereingaben und abrufen es in der nächste Anfrage. Nicht einmal Webforms können diese Art von Status quo aus der Box fälschen.

0

Wenn Sie an einem Objekt wie diesem festhalten möchten, ist es am einfachsten, den Ansichtszustand zu verwenden, obwohl Sie die Daten duplizieren werden, aber für ein kleines Objekt sollte es in Ordnung sein.

ViewState.Add("EmailObj", Email); 

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

Nur ein Gedanke, im Grunde eine Rolle Ihres eigen, aber nicht so schwer zu tun: die Liste

Shop, die Sie als Datenquelle in dem Ansichtszustand oder Sitzung verwenden, und hat ein verstecktes Feld in den gridview sei der Index oder ein Schlüssel für das Objekt, das der Zeile entspricht.

Mit anderen Worten "weiß" jede Zeile in der Gridview, welches E-Mail-Objekt in der Liste, auf der es basiert.

Verwandte Themen