【发布时间】:2016-06-03 10:40:52
【问题描述】:
我有我的主要对象Person 和一组Adrresses 值对象,如下所示:
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
}
在我的 asp 页面中,我有一个 Gridview,用户可以在其中添加、删除或更改地址。
问题是:如何从网格中的一个用户选择中获取正确的地址? 我是否必须从网格中读取每个字段并使用它们来构造我必须搜索的地址?
我使用CommandArgument 传递 Container.DataItemIndex 所以我不能用它来发送整个对象到代码
编辑: 这是网格的摘录:
<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>
这就是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
}
【问题讨论】:
-
您可以在这篇文章中找到您需要的信息:stackoverflow.com/questions/36827111/…。
-
它使用 DataKeyNames,同时我正在寻找一种方法来传递 Container.DataItem。我在 RowUpdating 中也有问题,因为 OldValues 和 newValues 是空的,因为我没有 ObjectDataSource(并且我只有在不是回发时才加载 gridview
-
我需要查看将数据绑定到 GridView 的代码以了解其工作原理。也许还有 GridView 的标记。
-
现在查看我编辑的问题
标签: c# asp.net gridview value-objects