gpt4 book ai didi

c# - 在 GridView (ASP.NET) 中编辑一个没有键(值对象)的对象

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:05 26 4
gpt4 key购买 nike

我的主要对象 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>

这是数据绑定(bind)

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
}

最佳答案

您可以定义一个方法来提供对象的字符串表示,以及一个接受相同表示的构造函数。由于您在评论中提到了 JSON,它可能是:

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

您可以将该 JSON 字符串保存在隐藏字段中:

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

并在 RowUpdating 事件处理程序中检索它以重新创建原始对象:

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

关于c# - 在 GridView (ASP.NET) 中编辑一个没有键(值对象)的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37612222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com