J'ai un GridView imbriqué qui est placé dans un ListView. Le GridView rend parfaitement bien avec toutes les entités qui sont liées à l'intérieur de sa source de données.Evénements de ligne imbriqués GridView
Chaque enregistrement dans ma grille a deux boutons - 'supprimer' et 'éditer'. Le problème que j'ai est que les méthodes câblées à chacun de ces boutons ne sont jamais virées.
Je pense que la raison de ce comportement est que ma liaison de données ListView se produit uniquement sur le premier chargement de page, et non sur chaque publication ultérieure. Par conséquent, lorsqu'une publication se produit, les événements de la grille imbriquée ne sont jamais câblés à nouveau, ce qui explique pourquoi mes méthodes ne sont pas déclenchées.
Voici ce que mon code [simplifié] ressemble:
<asp:ListView ID="uiListView" ... runat="server">
<LayoutTemplate>
...
</LayoutTemplate>
<ItemTemplate>
...
<asp:GridView ID="uiGridView"
OnRowDataBound="uiGridView_RowDataBound"
OnRowEditing="uiGridView_RowEditing"
OnRowDeleting="uiGridView_RowDeleting" runat="server">
<Columns>
...
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="uiEditRowButton" CausesValidation="false" CommandName="Edit" Text="Edit" runat="server" />
<asp:Button ID="uiRemoveRowButton" CausesValidation="false" CommandName="Delete" Text="Remove" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
...
</ItemTemplate>
</asp:ListView>
code Derrière:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) {
uiListView.ItemDataBound += new EventHandler<ListViewItemEventArgs>(uiListView_ItemDataBound);
uiListView.DataSource = ...;
uiListView.DataBind();
}
}
// Find a GridView and bind relevant data to it
private void uiListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem) {
ListViewDataItem listViewDataItem = (ListViewDataItem) e.Item;
GridView uiGridView = (GridView)listViewDataItem.FindControl("uiGridView");
...
uiGridView.DataSource = ...;
uiGridView.DataBind();
}
}
// For every row being bound to GridView, register the edit and delete
// buttons as postback controls
protected void uiGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Control uiEditButton = e.Row.FindControl("uiEditRowButton");
if (uiEditButton != null) {
ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(uiEditButton);
}
Control uiRemoveRowButton = e.Row.FindControl("uiRemoveRowButton");
if (uiRemoveRowButton != null) {
ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(uiRemoveRowButton);
}
}
}
// Method runs when a GridView's edit button is clicked
protected void uiGridView_RowEditing(object sender, GridViewEditEventArgs e)
{
Console.WriteLine('Editing Row...');
}
// Method runs when a GridView's delete button is clicked
protected void uiGridView_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
Console.WriteLine('Deleting Row');
}
J'ai essayé de modifier le code ci-dessus et en supprimant la clause "IsPostBack!", Et les événements effectivement été viré quand un bouton dans le GridView a été cliqué. Cependant, je ne me sens pas à l'aise de faire une base de données sur chaque publication et pense qu'il devrait y avoir une meilleure solution que cela.