Странное поведение события ASP.NET DataGrid ItemCommand
Я использую DataGrid только программно.
Public Class MyOwnDataGrid
Inherits MyBaseClass
Private DataControl As New WebControls.DataGrid
Public Property DataSource as DataTable = Nothing
Public Sub New()
AddHandler Me.DataControl.ItemCommand, AddressOf Me.DataGrid_ItemCommand
Me.DataControl.AutoGenerateColumns = False
End Sub
End Class
На Page_Load
Я связываю DataSource
и добавьте столбцы.
Protected Overrides Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
'I have to hold the DataSource in a Session variable because after PostBack is the DataSource property nothing
If (Not (Me.DataSource Is Nothing) And Not (Me.IsPostBack)) Then Session("DataSource") = Me.DataSource
If (Not (Session(Me.DataSourceSessionName) Is Nothing)) Then
Me.DataControl.DataSource = Session("DataSource")
Me.DataControl.DataSource.AcceptChanges()
End If
'add the columns with content
'add the columns for Actions
Dim oColumn As New TemplateColumn
oColumn.ItemTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Edit", .ToolTip = "Edit", .CommandName = "Edit"}}
oColumn.EditItemTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Update", .ToolTip = "Apply", .CommandName = "Update"}}
oColumn.FooterTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Insert", .ToolTip = "Add", .CommandName = "Insert"}}
Me.DataControl.Columns.Add(oColumn)
oColumn = New TemplateColumn
oColumn.ItemTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Delete", .ToolTip = "Delete", .CommandName = "Delete"}}
oColumn.EditItemTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Cancel", .ToolTip = "Cancel", .CommandName = "Cancel"}}
Me.DataControl.Columns.Add(oColumn)
'Bind the DataSource at every PostBack because otherwise the DataSource is empty and the control will be hidden
Me.DataControl.DataBind()
End Sub
Private Class ActionColumn
Implements System.Web.UI.ITemplate
Public Property Control As WebControls.ImageButton = Nothing
Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
If (Not (Me.Control Is Nothing)) Then container.Controls.Add(Me.Control.Clone)
End Sub
End Class
Моя проблема в том, что ItemCommand
Событие работает случайным образом.
Private Sub DataGrid_ItemCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
Select Case e.CommandName.ToUpper
Case "Edit".ToUpper
'do something
Case "Cancel".ToUpper
'do something
Case "Update".ToUpper
'do something
Case "Delete".ToUpper
'do something
Case Else
End Select
End Sub
Если я нажимаю кнопку Изменить или Удалить, он работает нормально. С помощью кнопки "Редактировать" в режиме редактирования устанавливается одна строка, и если я нажимаю на кнопку, происходит странное поведение. Доступны обе кнопки "Применить" и "Отмена". Если я нажму их на кнопку Применить, будет использована кнопка Удалить, а если я нажму кнопку Отмена, ItemCommand
событие не запускается, но строка больше не находится в режиме редактирования.
Где моя ошибка? Что я не так, что это не работает правильно? Если бы я создал столбцы в разметке, все работает нормально. Но не в моем случае со всеми на стороне сервера.
Спасибо за любой ответ.
1 ответ
Я могу тебе позвонить bindGrid()
метод после проверки page.ispostback
на page_load
как это:
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
return;
}
BindGrid();
}
проверьте этот пост.