2016-06-03 9 views
2

Ich habe meine Hauptaufgabe Person mit einer Sammlung von Adrresses Wertobjekt wie folgt aus:Bearbeiten ein Objekt, das wie kein Schlüssel (Objektwert) in Gridview (ASP.NET)

public class Person 
{ 
    public virtual int Id {get; set;} 
    public virtual string Name {get; set;} 
    private IList<Adrress > _adrresses= new List<Adrress>(); 
    public virtual IEnumerable Adrress Adrresses {...} 

    public virtual void AddAddress(Address a){...} 
    public virtual void RemoveAddress(Address a){...} 
    public virtual void ChangeAddress(OldAddress oa, OldAddress oa) 
    { 
     int index = _adrresses.IndexOf(oa); 
     if (index != -1) 
      _adrresses[index] = oa; 
    } 
} 

public class Adrress 
{ 
    public virtual string Street {get; set;} 
    public virtual string Number {get; set;} 
    public virtual string City {get; set;} 
    ... other 7 fields 
} 

In meiner Asp-Seite Ich habe a Gridview, wo Benutzer Adressen hinzufügen, entfernen oder ändern können.

Frage ist: Wie kann ich die korrekte Adresse von einer Benutzerauswahl im Raster erhalten? Muss ich alle Felder aus dem Raster lesen und sie verwenden, um die Adresse zu erstellen, die ich durchsuchen muss?

I verwenden CommandArgument Container.DataItemIndex passieren so ican't es verwenden gesamte Objekt-Code senden

EDIT: dies ein Extrakt des Gitters ist:

<asp:GridView ID="gvElencoFaseAttivita" runat="server" 
    AllowPaging="false" AutoGenerateColumns="False" 
    Width="100%" CssClass="datiGridView tabletwo" ShowHeader="False" 
    OnRowCommand="gvElencoFaseAttivita_RowCommand" 
    OnRowUpdating="gvElencoFaseAttivita_RowUpdating" 
    OnRowDeleted="gvElencoFaseAttivita_RowDeleted" 
    OnRowEditing="gvElencoFaseAttivita_RowEditing" 
    OnRowCancelingEdit="gvElencoFaseAttivita_RowCancelingEdit"> 
    <Columns> 
     <asp:TemplateField HeaderText="Sel"> 
      <ItemTemplate> 
       <asp:LinkButton ID="lbtnEditFaseAttivita" runat="server" CausesValidation="False" CommandName="Edit" CommandArgument='<%# Container.DataItemIndex %>' ToolTip="Modifica la fase" CssClass="imgModificaPiccola" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:LinkButton ID="lbtnAggiornaFaseAttivita" runat="server" ValidationGroup="UpdateFaseAttivitaGrid" CommandName="Update" CssClass="imgSalvaPiccola" ToolTip="Salva le modifiche" CommandArgument='<%# Container.DataItemIndex %>' /> 
      </EditItemTemplate> 
      <ItemStyle CssClass="gestioneFaseAttivitaTd2" /> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Street" SortExpression="Street"> 
      <ItemTemplate> 
       <asp:Label ID="lblStreet" runat="server" Text='<%# ((Adrress)Container.DataItem).Street %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="txtEditStreet" runat="server" Text='<%# ((Adrress)Container.DataItem).Street %>'></asp:TextBox> 
      </EditItemTemplate> 
      <ItemStyle CssClass="gestioneFaseAttivitaTd3" /> 
     </asp:TemplateField> 
    </Columns> 
    <SelectedRowStyle CssClass="selezioneGridView" /> 
    <AlternatingRowStyle CssClass="odd" /> 
</asp:GridView> 

und dies the dataBind

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
     loadGridAddress(); 
} 

protected void loadGridAddress() 
{ 
    using (iuow = kernel.Get<IUnitOfWork>()) 
    { 
     gvElencoFaseAttivita.DataSource = person.Addresses; 
     gvElencoFaseAttivita.DataBind(); 
    } 
} 

protected void gvElencoFaseAttivita_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    var a = e.OldValues[""]; //e.OldValues here is empty 
} 
+0

Sie können die Informationen finden, die Sie in diesem Beitrag nicht benötigen: http://stackoverflow.com/questions/36827111/asp-net-gridview-how-to-edit-and-delete-data -records/36828018 # 36828018. – ConnorsFan

+0

verwendet es DataKeyNames, während iam nach einer Möglichkeit sucht, Container.DataItem zu übergeben. Ich habe auch Problem in RowUpdating, da OldValues ​​und newValues ​​leer sind, da ich keine ObjectDataSource habe (und ich gridview nur lade, wenn nicht postback –

+0

Ich müsste den Code sehen, wo Sie die Daten an die GridView binden, um zu verstehen, wie es funktioniert vielleicht das Markup der GridView auch – ConnorsFan

Antwort

1

Sie können eine Methode definieren, die eine Zeichenfolge darstellt Objekt und einen Konstruktor, der die gleiche Darstellung akzeptiert. Da Sie JSON in einem Kommentar erwähnt, könnte es sein:

<EditItemTemplate> 
    <asp:HiddenField ID="hfAddress" runat="server" Value='<%# ((Address)Container.DataItem).ToJSON() %>' /> 
    <asp:TextBox ID="txtEditStreet" runat="server" Text='<%# ((Address)Container.DataItem).Street %>'/> 
    ... 
</EditItemTemplate> 

Und es in dem Handler RowUpdating Ereignis abrufen neu erstellen das:

public class Address 
{ 
    public virtual string Street {get; set;} 
    public virtual string Number {get; set;} 
    public virtual string City {get; set;} 
    ... 

    public string ToJSON() 
    { 
     // Encode the object as as JSON string 
     ... 
     return strJSON; 
    } 

    public Address(string json) 
    { 
     // Decode JSON string and set object properties 
     ... 
    } 
} 

Sie, dass JSON-String in einem versteckten Feld retten könnte Original-Objekt:

protected void gvElencoFaseAttivita_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    GridViewRow row = gvElencoFaseAttivita.Rows[e.RowIndex]; 
    HiddenField hfAddress = row.FindControl("hfAddress") as HiddenField; 
    TextBox txtEditStreet = row.FindControl("txtEditStreet") as TextBox; 
    Address oldAddress = new Address(hfAddress.Value); 
    string newStreet = txtEditStreet.Text; 
    ... 
} 
+0

oder direkt ohne eval, um zu vermeiden, Feld als Zeichenkette in aspx zu haben. iam auch das Spielen mit Newtonsoft.Json.JsonConvert.SerializeObject ((FaseAttivita) Container.DataItem, um ganz zu speichern Objekt als einzelne Zeichenfolge –

+1

Sie könnten eine 'ObjectValue' string -Eigenschaft der Adressklasse definieren, die eine vollständige Darstellung des Objekts enthalten würde, und den Wert dieser Eigenschaft in einem HiddenField speichern – ConnorsFan

+1

warum nicht json? und warum ich kann ' t vermeiden Sie, Eigenschaft Name in der Schnur zu kodieren? jetzt upvote Ihre Antwort, wenn redigieren, um "magische Schnur" zu vermeiden ich will akzeptieren. Jetzt muss ich bis Montag nach Hause gehen und arbeitsfrei sein. für jetzt danke –