我有一個嵌套的GridView放置在ListView中。 GridView呈現完全適用於綁定在其數據源中的所有實體。嵌套的GridView不會觸發行事件
我的gridview中的每條記錄都有兩個按鈕 - 「刪除」和「編輯」。我遇到的問題是連接到每個按鈕的方法都不會被觸發。
我認爲這種行爲的原因是因爲我的ListView的數據綁定只發生在第一頁加載,而不是每一個後續的回發。因此,當發生回發時,嵌套的gridview事件再也不會被連接 - 因此我的方法不會被解僱。
這裏是我的代碼[簡化]是這樣的:
<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>
代碼背後:
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');
}
我試圖修改上面的代碼,並刪除 「的IsPostBack!」 條款,以及事件實際上當點擊GridView中的一個按鈕時被觸發。不過,我覺得每回發一次數據綁定感覺不舒服,認爲應該有比這更好的解決方案。